首先来简单了解一下三个概念:
- 缓存穿透:大量死包查询到达缓存和数据库层,但 Daten nicht gefunden(数据无满足条件的数据)。
- 缓存雪崩:大量key同时过期失效,引起热点 queries,进而雪崩。
- 缓存陈旧:正常情况下,数据一直不过期,实际被DB更新了,导致缓存数据已经失效。
Redis解决方案:
1、 缓存穿透:
- 过滤请求:对非法请求直接拒绝。
- 缓存空对象:将空结果缓存起来,一定时间后再尝试查DB。
- 混合方案:同时使用上面两种方式。
2、 缓存雪崩:
- 失效时间随机化:分散失效时间,避免集中。
- 加互斥锁: 加分布式锁避免重复请求DB。
- 主备集群: 读写分离,主节点挂掉,备节点上线提供服务。
3、 缓存陈旧:
- 设置有效期:设置单独的有效期防止长时间缓存
- 活跃度检查:根据缓存活跃度定期刷新缓存
- 同步更新: 当DB更新时对应的同步更新缓存
总结一下:
- 缓存穿透:主要解决方案是过滤请求和缓存空对象。
- 缓存雪崩: 主要采用失效时间随机化、互斥锁和主备模式。
- 缓存陈旧: 设置有效期、活跃度检查和同步刷新缓存。
综合使用上述策略可以有效解决 Redis 缓存的这些问题。