什么是缓存击穿?

缓存击穿是指某一个热点 Key 在失效的瞬间,有大量的并发请求同时访问这个 Key。

由于缓存失效,这些请求会同时穿透到数据库进行查询并回写缓存。对于超高并发的系统,这瞬时流量可能直接压垮数据库。

  • 缓存穿透:数据库中不存在该数据,请求由于缓存不命中而持续压向数据库。
  • 缓存击穿:数据库中存在该数据,只是缓存中的热点 Key 突然失效,导致海量请求瞬间到达数据库。

核心特征

  • 针对单个热点数据(Hot Key)。
  • 缓存过期瞬间并发量极高。

常见成因

  1. 热点数据过期:例如秒杀活动中的商品信息过期。

常见解决方案

  1. 互斥锁 (Mutex Lock):只允许一个线程(或请求)去加载数据库并回写缓存,其他线程等待或重试。常用 SETNX 实现。
  2. 热点数据永不过期:不设置物理过期时间,而是由后台异步线程负责更新和维护缓存的有效性。
  3. 逻辑过期:在 Value 中存储过期时间,发现过期后异步刷新,而当前请求先返回旧数据。