场景——Redis
一、Redis缓存穿透、雪崩、击穿,如何解决?
1 缓存穿透:“查无此物”
概念:客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库;
原因:
- 数据未设置缓存
- 恶意攻击
方案:
- 布隆过滤器:预加载所有的 Redis KEY 到布隆过滤器中,查询时先判断数据是否存在;
优点:速度快,占内存低;
缺点:存在误判,优化方案- 增加 bitmap 位数长度
- 增加 hash 函数的个数
-
空值缓存:将查询结果为空的键也存入缓存,设置较短过期时间(如5分钟);
优点:实现简单;
缺点:可能缓存大量无效Key;
2 缓存雪崩:“集体罢工”
概念:大量 KEY 同时失效,请求直接打到数据库;
原因:
- 批量过期:大量 Key 设置相同 TTL,同时失效;
- Redis 宕机:集群故障导致所有请求压到数据库;
方案:
- 随机过期时间:大批量的 KEY 设置随机的过期时间;
缺点:无法应对 Redis 宕机; - 多级缓存架构:本地缓存 -> 分布式缓存
3 缓存击穿
概念:热点 KEY 突然失效,大量请求直接打到数据库;
方案:
- 分布式锁:当缓存失效时,通过分布式锁(Redisson)控制仅一个线程重建缓存;
优点:强一致性;
缺点:加锁时,请求阻塞,影响性能; - 逻辑过期时间:Redis 缓存永不过期,但存储数据时附加逻辑过期时间;(如定义一个类时,加上一个过期时间的字段,查询时判断该字段)

浙公网安备 33010602011771号