缓存击穿是Redis中常见的问题之一,
热门的key值在正需要的时候,突然失效了,导致同一时间,大量请求直逼mysql,mysql瞬间崩了。
主要原因如下:
1. 热点数据失效
当某个高频访问的缓存数据(如热门商品信息)在缓存中过期时($$ TTL \to 0 $$),大量并发请求会同时尝试访问该数据。由于缓存中不存在该数据,所有请求会直接穿透到数据库层。
2. 瞬时并发量激增
在缓存失效的瞬间,大量请求同时到达数据库: $$ \text{并发请求量} \gg \text{数据库处理能力} $$ 这会导致:
- 数据库连接池被占满
- 后续请求阻塞或超时
- 严重时引发数据库宕机
3. 未命中缓存逻辑
缓存系统通常采用以下逻辑:
if cache.exists(key):
return cache.get(key)
else:
data = db.query(key) # 所有请求同时执行此操作
cache.set(key, data)
当大量请求同时进入 else 分支时,会造成数据库重复查询。
总结核心原因 :
缓存击穿的本质是对单一热点数据的并发请求在缓存失效瞬间直接冲击数据库,形成系统瓶颈。解决需结合互斥锁、永不过期策略或提前续期等方案。