Redis缓存雪崩、缓存击穿、缓存穿透和常见的几种缓存模式

Redis缓存雪崩、缓存击穿、缓存穿透和常见的几种缓存模式
最新回答
微凉°

2020-07-12 21:29:05

Redis缓存雪崩、击穿、穿透及常见缓存模式的核心要点如下

一、缓存雪崩
  • 定义:当大量缓存key在同一时间集中失效,导致所有请求直接穿透至数据库,引发数据库压力骤增甚至宕机。
  • 解决方案

    加锁排队:利用Redis的SETNX实现互斥锁,仅允许一个线程加载数据并更新缓存,其他线程等待或重试。

    数据预热:系统启动时预先加载热点数据到缓存,或通过定时任务提前更新缓存。

    双层缓存策略:设置短期失效的原始缓存(C1)和长期失效的拷贝缓存(C2),C1失效时访问C2。

    定时更新:对非实时性要求高的数据,通过定时任务更新缓存。

    分散过期时间:为不同key设置随机过期时间,避免集中失效。

二、缓存击穿
  • 定义:高并发场景下,单个热点key在失效瞬间被大量请求同时查询,导致数据库压力激增。
  • 问题:数据库请求量瞬间暴增,可能引发性能瓶颈或崩溃。
  • 解决方案

    互斥锁:第一个请求获取锁后查询数据库并更新缓存,其他请求等待锁释放后直接读取缓存。

三、缓存穿透
  • 定义:查询数据库中不存在的数据,导致每次请求均穿透缓存直达数据库,形成无效查询。
  • 问题:数据库被频繁访问,浪费资源且可能被恶意攻击。
  • 解决方案

    缓存空值:将查询结果为空的数据缓存(如null),设置短过期时间(如5分钟)。

    布隆过滤器:在缓存前加一层布隆过滤器,拦截不存在的key,避免查询数据库。

四、常见缓存模式
  1. Cache Aside(旁路缓存)

    流程

    读:先查缓存,未命中则查数据库,并写入缓存。

    写:先更新数据库,再使缓存失效。

    问题

    并发写可能导致脏数据(如读请求写入旧数据后被写请求失效覆盖)。

    极端场景下仍可能脏数据(如读请求写缓存前被写请求失效)。

  2. Read/Write Through(读写穿透)

    流程:应用直接操作缓存,由缓存服务同步更新数据库。

    特点

    脏数据概率低,但强依赖缓存稳定性。

    适合读多写少场景。

  3. Write Behind(异步写入)

    流程:应用直接操作缓存,由缓存服务异步批量更新数据库。

    特点

    性能高,但数据一致性差,可能丢失数据。

    实现复杂,需处理异常恢复逻辑。

总结

  • 缓存雪崩需分散失效时间或提前预热;击穿需锁机制保护热点key;穿透需过滤无效请求。
  • Cache Aside简单但需处理并发,Read/Write Through依赖缓存稳定性,Write Behind性能最优但风险高。根据业务场景选择合适模式。