缓存穿透、击穿、雪崩

缓存穿透、击穿、雪崩

一、概念介绍:

1)缓存穿透:在高并发下,查询一个不存在的值时,缓存不会被命中,导致大量请求直接访问数据库;

2)缓存击穿热点key,缓存过期,直击数据库。比如:秒杀活动的时候,大量用户进行抢购某个商品,而此时刚好key过期了,那么这些请求就直接命中到数据库了。

3)缓存雪崩大量的缓存key在同一时间失效,导致大量的请求落到数据库上。如活动系统里面同时进行着非常多的活动,但是在某个时间点所有的活动缓存全部过期。

二、解决办法

1)缓存穿透解决办法:

  • 在接口层增加校验:比如用户鉴权校验,参数校验,不合法的参数直接代码Return,比如:id做基础校验,id <=0的直接返回;
  • 缓存null值:但是缓存NULL的时间不能太长,否则NULL数据长时间得不到更新,也不能太短,否则达不到防止缓存击穿的效果;
  • 布隆过滤器(Bloom Filter):类似于哈希表的一种算法,用所有可能的查询条件生成一个bigmap,在进行数据库查询之前会使用这个bitmap进行过滤,如果不在其中则直接过滤,从而减轻数据库层面的压力。

2)缓存击穿解决办法:

  • 设置热点key永不过期;
  • 使用互斥加锁:对缓存查询加锁,如果key不存在,就加锁,然后查DB入缓存;其他进程如果发现有锁就等待,然后等待解锁后返回数据或者进入DB查询。

3)缓存雪崩解决办法:

  • 缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生;
  • 设置热点数据永不过期;

三、总结:

1)缓存穿透:查询一个不存在的值时,未命中缓存,直接落到了数据库。解决方案:接口校验、缓存NULL值、Bloom Filter;
2)缓存击穿:热点key,缓存过期,直击数据库。解决办法:设置永不过期、加锁互斥获取数据;
3)缓存雪崩:大量的缓存key在同一时间失效,导致大量请求落到数据库上。解决方案:设置永不过期、随机过期时间;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值