关于缓存的那些事
防御型编程
- 缓存穿透, 不存在的 key
- 缓存击穿, 单个缓存 key 失效, 缓存重建期间, 短时大量请求到达数据库
- 缓存雪崩, 大量缓存 key 同时失效, 大量请求导致数据库崩溃
缓存穿透(Cache Penetration)
大量缓存根本无法命中的请求导致数据库查询。
因数据库不存在目标数据,导致缓存也无法重建。
最终会频繁查询数据库而造成负载。
原因
- 恶意请求
- 缺少必要的参数校验导致通信参数未符合预期
- 上游服务同步等异常导致的数据不一致
解决
- 增加参数校验
- 对缓存重建失败的请求进行限流
- 缓存重建的有效值校验
- 通过布隆过滤器判断数据是否存在于数据库中,减少频繁的查询
缓存击穿(Cache Breakdown)/缓存雪崩(Cache Ava
缓存失效时,大量请求在缓存重建期间到达数据库。
缓存击穿可以由单个热点 key 引发。
缓存雪崩是指多个 key 同时失效。
原因
- 缓存过期
- 内存不足导致缓存写入失败
- 内存不足因缓存策略导致热点key被替换
解决
- 为过期时间添加随机数,避免同一时刻批量过期
- 提前续期/永不过期
- 限制缓存重建的并发数, 减少重建期间的压力