缓存穿透
情景
用户请求的数据,在缓存中不存在,数据库中也不存在。这样缓存就没有办法命中,每一次请求都会打到数据库。
解决方案
- 缓存空对象
- 优点:实现简单
- 缺点:
- 额外的内存消耗
- 短时间的数据不一致
- 布隆过滤器
- 优点:布隆过滤器可以只占用极少的空间来判断数据是否存在
- 缺点:
- 实现相对复杂
- 哈希冲突时,存在误判的情况
缓存雪崩
情景
在短时间内,缓存中大量的Key同时失效或者Redis挂掉了,这是大量的请求就直接打到了数据库。
解决方案
- 在将数据导入缓存时,在相同的ttl时间后追加相应的随机值(避免同一时间过期)
- 使用Redis集群避免服务挂掉
- 在架构上增加服务降级等策略
- 使用多级缓存(每个节点上都使用相应的缓存)
缓存击穿
情景
慢查询缓存过期,大量请求同时发起慢查询。
解决方案
- 使用分布式锁,同一时间只有一个请求可以发起慢查询
- 使用逻辑过期方案,异步发起慢查询更新缓存,并将过期数据返回。
评论区