缓存穿透击穿雪崩怎么处理

缓存穿透击穿雪崩怎么处理

缓存穿透、击穿、雪崩是三个经典问题。本文从现象到解决方案,把这三个概念讲清楚。

先明确 Redis 在系统里的角色

Redis 常见用途不是“替代数据库”,而是缓存热点数据、保存会话、做简单计数、排行榜、分布式锁等。设计时要先问:这份数据丢了能不能恢复?是否允许短暂不一致?

一个缓存查询的基本写法

String key = "user:" + userId;
User user = redisTemplate.opsForValue().get(key);
if (user != null) {
return user;
}
user = userMapper.selectById(userId);
if (user != null) {
redisTemplate.opsForValue().set(key, user, Duration.ofMinutes(30));
}
return user;

这个流程看起来简单,但要注意缓存穿透、缓存击穿和缓存雪崩。

三个常见问题

  • 穿透:查询不存在的数据,可以缓存空值或用布隆过滤器。
  • 击穿:热点 key 过期瞬间大量请求打到数据库,可以用互斥锁或逻辑过期。
  • 雪崩:大量 key 同时过期,可以给过期时间增加随机值。

验证方式

本地可以先用 redis-cli 查看 key:

redis-cli
GET user:1001
TTL user:1001

确认缓存写入、过期时间和删除策略都符合预期。


   转载规则


《缓存穿透击穿雪崩怎么处理》 小乐 采用 知识共享署名 4.0 国际许可协议 进行许可。
  目录