热点缓存
2025年01月05日
一、认识
缓存击穿 是指某些热点 key
(如秒杀商品详情)在过期瞬间,有大量请求同时访问,导致这些请求直接打到数据库。
二、原因
-
热点缓存的过期时间设置不当。
-
并发访问集中在某些热点数据。
三、解决方案
3.1 设置热点缓存永不过期
对热点数据定期主动更新,而不是设置过期时间。
3.2 使用互斥锁
当缓存失效时,使用分布式锁(如 SETNX
或 Redisson
)确保只有一个线程查询数据库并更新缓存。
if not redis.exists(key):
if redis.setnx(lock_key, "lock"):
# 查询数据库并更新缓存
redis.set(key, db_value, expire_time)
redis.delete(lock_key)
3.3 热点预热
在系统启动或高并发场景前提前加载热点数据到缓存中。
3.4 请求分流
针对热点数据,使用 CDN
或本地缓存(如 Nginx
缓存)减少对 Redis
的访问。