Redis缓存失效三大问题如何解决(穿透、击穿、雪崩)

Redis缓存三大问题

  • 缓存穿透
  • 缓存击穿
  • 缓存雪崩
缓存穿透
发生原因:

简单的来说就是缓存中明明没有对应数据,但是有大量的请求这些不存在的数据,导致大量请求直接打在DB上,众所周知DB十分金贵脆弱,大量请求同时发生很容易导致宕机。
举个栗子,比如有人获取到了url恶意发起攻击,疯狂请求id = -1 ,明明就不可能存在,所以大量请求发生在了数据库,导致宕机。

解决

方案1: 缓存空对象 设置空key

如果真有人那么无趣非要一直请求id = - 1,那么就在第一次请求后 数据库一定会返回一个null值,直接把做个null值甩到Redis中,这样下一次再请求id= -1 ,就不会打到数据库了,会直接从Redis返回null 从而得知这是一个无效请求。
但是这种方法会大量浪费Redis的内存空间,建议还是要给空key设置一个过期时间。
方案2: 设置布隆过滤器
布隆过滤器就是一种方便检测数据库中是否含有对应key的工具。
它是基于bitmap的一种方式,比如key = “hello” 会根据key的具体值进行计算bitmap就可能将下表1、3、5置为1,当key = "nihao"会将 下表3、6、9置为1。当我们请求发来的时候 如果key是hello 那就 会去bitmap中检测 1 3 5下表是否为1,如果是则含有。
布隆过滤器在使用上可能比设置空key节省内存空间,因为bitmap本身占用空间很小,但是布隆过滤器是要经过复杂计算的,而且它的精确度也无法达到100%,精度需求越高计算量就越大。

缓存击穿
发生原因:

大量请求同一个key 但是这时恰好这个key到了过期时间,所有的请求都打向了DB这时就有可能造成DB被打崩。

解决

**方案1:**加互斥锁
同时大量相同的请求打到DB,那么就可以加互斥锁 同时只能一个请求打到DB其他的请求陷入自旋状态,知道唯一 一个到大DB的请求把数据写回到Redis,再从Redis拿回数据即可。

**方案2:**设置热点数据不过期
这个方案就比较特殊了,只要key不过期 那么就永远不会发生击穿,但运行维护成本会直线上升。

缓存雪崩
发生原因:

大面积key同时失效 导致缓存彻底失去作用。

解决

方案1: redis高可用:多增设redis
以集群的方式防止Redis单一机器宕机后引发雪崩。
方案2: 限流降级 : 通过加锁或队列的方式控制线程数量 (关掉一些不重要的功能)
方案3: 数据预热 :提前设置好key

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值