Redis的缓存击穿,穿透,雪崩以及解决方案

文案分享:

                一颗向上的心脏,不该有一副下坠的身躯

        An upward heart should not have a downward body

什么是击穿现象

当一个key在redis中过期了此时有大量的并发请求访问到这个key,发现redis中这个key过期了,只能访问数据库,此时大量的请求访问底层数据库,造成数据库崩溃,这种现象称作击穿。

缓存击穿的解决方案

分析问题:因为有大量的请求访问这个key,那么说明这个key就是热点数据。

        1. 预先设置热点数据:在访问前期,先把一些热点数据放到redis中并且调整他的过期时间。

        2.实时调整:现场监控哪些是热点数据,实时进行过期时间调整

        3.使用锁:当缓存失效的时候,不是立即去加载DB。而是先使用缓存工具中带有成功操作返回值的操作去设置一个key,当操作成功说明可以访问去加载db,如果操作失败,则说明正在有线程访问,此时让当前线程睡眠一段时间再访问。

什么是穿透现象

当一个key在redis中和在db中都不存在时,大量的请求访问db,造成db崩溃。一般是黑客利用此漏洞来压垮数据库。因为redis是不存储查询不到的数据,每次请求到redis没有自己就去db查了。

缓存穿透的解决方案

    1.对空值就行缓存:如果一个查询返回的数据为空,就把这个空值暂时存储到redis中,设置过期时间不要太长。
    2.设置白名单:使用bitmaps类型定义一个可以访问的白名单,把id存进去。如果访问的id再这里面就可以访问,如果没有就拒绝访问。
    3.布隆过滤器:可以用于检索一个元素是否在一个集合中,只会返回,可能存在或者一定不存在,他的空间效率和查询时间远远超过一般的算法,将所有可能存在的数据存到bitmaps中,一个一定不存在的数据这个bitmaps就会拦截掉,从而避免底层db的查询压力。

什么是雪崩现象

key对应的数据存在,但是key过期了,并且大量的请求访问大量的key,大量的key全过期了,那就大量的请求访问db去了,其实和击穿的意思差不多,只不过是雪崩是大量的key过期。

缓存雪崩的解决方案

1.构建多级缓存架构:nginx缓存+redis缓存+其他缓存
2.使用锁或队列:用锁或者队列的方式保证不会有大量的线程对数据库一次性进行读写,从而避免大量的并发请求落到db上
3.设置过期标注更新:记录缓存数据是否过期,如果过期会触发通知另外的线程去更新实际key的缓存
4.将缓存失效时间分开:在原有的失效时间内添加一个随机值,让每个key失效时间都不一样,这样就避免集体失效。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值