场景——Redis

一、Redis缓存穿透、雪崩、击穿,如何解决?

1 缓存穿透:“查无此物”

概念:客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库;

原因:

  • 数据未设置缓存
  • 恶意攻击

方案:

  • 布隆过滤器:预加载所有的 Redis KEY 到布隆过滤器中,查询时先判断数据是否存在;
    优点:速度快,占内存低;
    缺点:存在误判,优化方案
    • 增加 bitmap 位数长度
    • 增加 hash 函数的个数
  • 空值缓存:将查询结果为空的键也存入缓存,设置较短过期时间(如5分钟);
    优点:实现简单;
    缺点:可能缓存大量无效Key; 

2 缓存雪崩:“集体罢工”

概念:大量 KEY 同时失效,请求直接打到数据库;

原因:

  • 批量过期:大量 Key 设置相同 TTL,同时失效;
  • Redis 宕机:集群故障导致所有请求压到数据库;

方案:

  • 随机过期时间:大批量的 KEY 设置随机的过期时间;
    缺点:无法应对 Redis 宕机;
  • 多级缓存架构:本地缓存 -> 分布式缓存

3 缓存击穿

概念:热点 KEY 突然失效,大量请求直接打到数据库;

方案:

  • 分布式锁:当缓存失效时,通过分布式锁(Redisson)控制仅一个线程重建缓存;
    优点:强一致性;
    缺点:加锁时,请求阻塞,影响性能;
  • 逻辑过期时间:Redis 缓存永不过期,但存储数据时附加逻辑过期时间;(如定义一个类时,加上一个过期时间的字段,查询时判断该字段)
posted @ 2025-08-08 17:20  幻月hah  阅读(6)  评论(0)    收藏  举报