redis穿透、击穿、雪崩
穿透
数据库、redis中没有这个数据
解决方法:
- redis缓存空对象
- 布隆过滤器
- 加锁:当有一个key在redis中没查到,就加个锁,去数据库里查出来,再解锁。
挡住无效请求,重复请求
当缓存未命中时,先抢互斥锁,
只有获取锁的线程可以查询数据库,
其他缓存未命中的线程等待或返回默认值
其他缓存未命中的再去抢锁
击穿
一个热门key过期或者一个没被缓存的数据访问量突然增大(数据库有,但没被缓存)
解决方法:
- 互斥锁(Mutex Lock):只允许一个线程去重建缓存,其他线程等待或返回旧值。
- 永不过期策略:缓存不设置过期时间,通过后台任务定期更新。
- 多级缓存:采用本地缓存 + Redis 的两级缓存架构。
雪崩
大量key同时过期
解决方法:
- 设置不同过期时间:避免大量 key 同时过期
- 多级缓存架构:构建本地缓存 + Redis + 数据库的多级缓存
- 热点数据永不过期:对关键数据不设置过期时间,通过后台更新
- 熔断降级机制:当数据库压力过大时,暂时拒绝部分请求
- 缓存预热:系统启动时提前加载热点数据
- 集群部署与分片:通过集群分散压力
redis怎么删除过期key/回收key
后台轮询,分段分批删除哪些过期key
请求的时候判断是否已经过期了
redis怎么淘汰key
内存空间不够了,就得淘汰了
默认情况下是不淘汰的,noeviction (默认策略)达到内存限制时,新写入操作就只会报错
淘汰全体key
过期key淘汰
怎么缓存预热
提前将热点数据加载到缓存中的过程叫缓存预热
如何知道那些key是热点key?
- 用户行为分析:通过日志分析高频访问数据
- 业务指标:订单量、点击量高的商品/内容
- 实时监控:使用Redis监控命令识别热点Key