三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

Redis缓存三大难题:击穿、雪崩、穿透

Redis缓存三大难题:击穿、雪崩、穿透

正常缓存使用流程

Redis 充当数据库的挡箭牌:

  1. 用户请求过来,优先查询 Redis 缓存
  2. ✅缓存命中:直接返回缓存数据,不访问数据库
  3. ❌缓存未命中:查询 MySQL 数据库
    • 数据库查到数据:把数据写入 Redis,设置过期时间,返回结果,供后续请求复用
    • 数据库也查不到数据:返回空 / 业务异常、


1. 缓存击穿

现象 & 原因

某一个热点 key 失效,大量并发打向数据库冷门 key 突然变成热点,key 刚好过期。大量并发同时绕过 Redis,直接请求数据库。

  • 数据库压力瞬间飙升
  • 多线程重复查库、重复写 Redis,浪费系统资源

解决方案

  1. 永不过期策略热点 key 设置为永不过期;冷门 key 正常过期;也可监控访问量,流量暴涨时动态改成永不过期。
  2. 加锁排队(双重检查锁)缓存未命中时加锁,只放行一个线程去查库 + 回填缓存,其他线程等待。 释放锁之后,其他线程再次读取缓存,直接拿到数据。

单机用本地同步锁就够用;分布式场景使用分布式锁。


2. 缓存雪崩

定义 & 成因

大量 key 同时失效 / Redis 整体宕机,大量请求全部打到数据库,系统直接崩溃

  1. 大量缓存 key 集中同一时间过期,缓存大面积失效
  2. Redis 服务宕机、集群故障 影响范围是全量业务,整个服务不可用,危害最大。

解决方案

  1. 过期时间增加随机偏移值,打散过期时间,避免集体失效
  2. Redis 高可用:部署哨兵、Redis 集群,防止单点宕机
  3. 多机房灾备降级,做好服务熔断限流,Redis 挂掉保护数据库。

3. 缓存穿透

定义 & 危害

查询的数据,Redis、数据库里都不存在一般是恶意攻击,传入伪造、非法的 ID。缓存查不到,数据库也查不到,但是每一次请求都要访问数据库,大量请求压垮存储。正常业务很少出现,攻击场景危害巨大。

解决方案

  1. 参数校验:提前拦截非法参数(负数、非法格式 ID),但是无法拦截格式合法但实际不存在的 ID。
  2. 缓存空值:数据库查不到,也把空结果存入 Redis,设置较短随机过期时间,拦截后续相同请求。
  3. 布隆过滤器:把合法存在的 ID 预先存入布隆过滤器;请求先过过滤器,判断不存在直接返回,不访问缓存和数据库。节省内存,适合防攻击。
← 返回列表