缓存穿透和缓存击穿是两个不同问题。查不到的数据如果不缓存空值,恶意或高频请求会一直打到数据库;热点 key 过期瞬间,如果所有请求都重建缓存,数据库也会被压住。

空值缓存要设置短 TTL,避免长期遮挡后续真实数据。热点重建可以用互斥锁,只有一个请求回源,其他请求等待或返回旧值。

val := cache.Get(key)
if val == miss {
    if lock.TryLock(key) {
        defer lock.Unlock(key)
        return rebuild()
    }
    return retryLater()
}

不要把所有 key 都设置同一个过期时间,批量同时失效会制造人为峰值。可以在基础 TTL 上加随机抖动。

缓存策略的核心不是命中率数字,而是数据库在异常流量下还能不能稳住。

分类: 数据库与缓存 标签: Redis 缓存 高并发

评论

-- 评论已关闭 --

全部评论