一 Redis雪崩、穿透和击穿
1. Redis雪崩:
Redis雪崩是指在某一时刻,缓存中大量的缓存数据同时失效或过期,导致大量的请求直接打到后端数据库,导致数据库负载剧增,引发性能问题甚至崩溃。这通常是因为缓存数据的过期时间设置过于集中,或者在同一时间段内大量缓存同时失效造成的。
2. Redis穿透
Redis穿透是指恶意或者异常请求查询一个不存在于缓存和数据库中的数据,导致每次请求都会直接访问数据库,增加了数据库负担。这可能是攻击者故意进行的,也可能是由于业务逻辑问题造成的。
3. Redis击穿:
Redis击穿是指某个热点数据突然失效或被删除,而此时大量请求正好同时访问该热点数据,导致这些请求都直接打到数据库上,导致数据库压力激增。与雪崩不同,击穿是因为某个特定的缓存数据失效导致。
示例:
让我们以一个简单的Java代码示例来说明Redis雪崩、穿透和击穿的概念。
假设有一个电影信息查询系统,用户可以根据电影ID查询电影信息。我们使用Redis作为缓存来存储电影信息,但是只对热门电影设置了缓存,其他电影没有被缓存。
@Service
public class MovieService {
@Autowired
private MovieRepository movieRepository;
@Autowired
private Jedis jedis;
public Movie getMovieInfo(String movieId) {
String cacheKey = "movie:" + movieId;
String cachedInfo = jedis.get(cacheKey);
if (cachedInfo == null) {
Movie movie = movieRepository.findById(movieId);
if (movie != null) {
jedis.setex(cacheKey, 3600, movie.toString()); // 缓存1小时
return movie;
}
}
return Movie.fromString(cachedInfo);
}
}
Redis雪崩示例:
假设在某一时刻,缓存中存储了很多电影信息,这些缓存在同一时间内同时失效,导致大量请求直接访问数据库,造成数据库压力激增。