缓存穿透、击穿、雪崩

xiaojiuaigc@163.com 发布于 2024-10-31 350 次阅读


缓存穿透

缓存穿透:查询一个不存在的数据,mysql查询不到数据也不会直接写入缓存,就会导致每次请求都查数据库

解决方案:

解决方案(一)

缓存空数据,查询的数据为空,吧这个空结果放到缓存里面去

优点:简单

缺点:消耗内存可能会发生数据不一致的问题

解决方案(二)

布隆过滤器:用于检索一个元素是否在一个集合中

这是测试文本,单击 “编辑” 按钮更改此文本。

缓存击穿

缓存击穿:给某一个key设置了过期时间,当key过期的时候,恰好这时间点对这个key有大量的并发请求过来,这些并发的请求可能会瞬间把DB压垮

解决方案

1互斥锁(性能较差,需要强一致性时使用)

解决方案2:逻辑过期(性能较优,高可用)

缓存雪崩

缓存雪崩是指在同一时间段有大量的缓存key同时失效或者Redis服务宕机,导致大量的请求到达数据库,带来巨大压力

解决方案:给不同的Key的TTL添加随机值

利用Redis集群提高服务的可用性(哨兵、集群模式)

给缓存业务添加降级限流策略(nginx/spring cloud gateway)(可以作为系统的保底解决策略适用于穿透、击穿、雪崩)

给业务添加多级缓存(Guava或者Caffein)

助记诗:

《缓存三兄弟》

穿透无中生有key,布隆过滤null隔离。

缓存击穿过期key,锁与非期解难题。

雪崩大量过期key,过期时间要随机。

面试必考三兄弟,可用限流来保底。