缓存雪崩、缓存穿透、缓存击穿

缓存雪崩

某一个时刻出现大规模的缓存失效的情况,导致大量的请求直接打在数据库上,导致数据库压力巨大,如果在高并发的情况下,可能瞬间就会导致数据库宕机。

解决方案:

1、在原有的失效时间上加上一个随机值,比如1-5分钟随机。这样就避免了因为采用相同的过期时间导致的缓存雪崩;也可以采用多级缓存

2、给业务降级限流,使用熔断机制。

当流量到达一定的阈值时,就直接返回“系统拥挤”之类的提示,防止过多的请求打在数据库上。至少能保证一部分用户是可以正常使用,其他用户多刷新几次也能得到结果。

3、提高数据库的容灾能力,可以使用分库分表,读写分离的策略。

4、为了防止Redis宕机导致缓存雪崩的问题,可以搭建Redis集群,提高Redis的容灾性。

缓存穿透

指客户端请求一个不存在的目标,这样请求永远会打到数据库

解决方案

缓存空对象

  • 优点:实现简单,维护方便
  • 缺点
    • 额外的内存消耗
    • 短期的不一致

缓存空对象.png

布隆过滤

  • 优点:内存占用少,没有多余key
  • 缺点:
    • 实现复杂
    • 存在误判可能

布隆过滤.png

缓存击穿

缓存击穿是一个热点的Key,有大并发集中对其进行访问,突然间这个Key失效了,高并发同时尝试重建缓存(查表),导致并发全部打在数据库上,导致数据库压力剧增。

解决方案

1、逻辑过期,在value中设置过期时间

2、使用互斥锁。如果缓存失效的情况,只有拿到锁才可以查询数据库,降低了在同一时刻打在数据库上的请求,防止数据库打死。当然这样会导致系统的性能变差。

缓存击穿.png

参考:

  1. 什么是缓存雪崩、缓存击穿、缓存穿透?
  2. 黑马程序员-Redis

ねぇ,あなたは何色になりたい