Redis 缓存空值和互斥重建
缓存穿透和缓存击穿是两个不同问题。查不到的数据如果不缓存空值,恶意或高频请求会一直打到数据库;热点 key 过期瞬间,如果所有请求都重建缓存,数据库也会被压住。
空值缓存要设置短 TTL,避免长期遮挡后续真实数据。热点重建可以用互斥锁,只有一个请求回源,其他请求等待或返回旧值。
val := cache.Get(key)
if val == miss {
if lock.TryLock(key) {
defer lock.Unlock(key)
return rebuild()
}
return retryLater()
}不要把所有 key 都设置同一个过期时间,批量同时失效会制造人为峰值。可以在基础 TTL 上加随机抖动。
缓存策略的核心不是命中率数字,而是数据库在异常流量下还能不能稳住。
版权申明
本文系作者 @blogger 原创发布在Redis 缓存空值和互斥重建。未经许可,禁止转载。
评论
-- 评论已关闭 --
全部评论