redis_缓存击穿/缓存穿透/缓存雪崩的解决方案以及分布式锁的概念

缓存击穿

缓存击穿:key对应的数据存在,但在redis中过期或者是被redis的淘汰策略LRU或者LFU给清除掉,此时若有大量并发请求过来,这些请求发现缓存没有数据一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。
解决方案:多个线程请求访问redis服务,没有查询到数据,则用setnx不存在则新建,来创建锁,创建成功则去请求db然后反写到redis,其他请求下次就可以请求到数据从而不去请求db,减少服务器端压力;如果没有创建成功说明有请求创建锁了,正在请求db,则该线程休眠一段时间再去尝试setnx创建锁。
问题1:创建setnx成功的线程如果挂了,但是没有释放锁,其他的请求会一直休眠,被阻塞不能继续请求db反写redis。
解决问题1:setnx之后设置过期时间,到时间没有释放则自动释放锁,解决死锁问题。
问题又来了,如果过期时间到了,但是因为db阻塞,线程没有挂,导致创建setnx锁没有返回,如果过期了新建setnx,那么陆续会有线程阻塞到db!
解决方案:使用多线程,一个线程去获取db数据,一个线程作为监控,如果线程没有挂也没有获取到数据则更新延迟过期时间,从而保证阻塞的线程继续拥有锁去获取db数据,不会继续让锁过期再新建锁,再有新请求阻塞到redis。
在这里插入图片描述

缓存穿透

缓存穿透:key对应的数据在数据源并不存在,每次针对此key的请求从缓存获取不到,请求都会到数据源,从而可能压垮数据源。比如用一个不存在的用户id获取用户信息,不论缓存还是数据库都没有,若黑客利用此漏洞进行攻击可能压垮数据库。
解决方案;使用布隆过滤器,将db存在的数据在过滤器先存入,等后期访问,如果是没有的key则直接返回,不会去请求db服务器。
实施方案;可以在客户端实现算法,不会去请求redis实例,把客户端里植入布隆过滤器相应的算法,让你所有客户端里边就包含了,如果你客户端包含了所有的布隆过滤器的算法,以及它缓存的这些数据的话,那么也就是代表着连redis这块的压力都没有;客户端只包含算法,然后你的布隆过滤器的bitmap是在redis里,服务里只有算法;或者redis服务集成布隆,客户端是瘦的,也根本里边连算法、连数据都没有,所有东西都压到了你的redis。那么这样的话,你的客户端相对简单一点。
布隆弊端:业务当中的数据会有大量的增删改的话,有些数据会被删除掉,那么这时候你只能往里增,那么代表着,你别一查有这个,然后到数据库了,结果数据库里面还没有这个数据,你要给他置空,要么是做一个什么问题,就是换一个过滤器,比如布谷鸟或者布隆过滤器+,能够支持删除的.
如果那个删了,就做一个空key,你就可以继续使用布隆过滤器,反正你查
的时候,查一个key是空的,就返回了,然后也不会触发布隆那个环节,总之你要既能使用到过滤器,阻止流量到达它,你也得支持这块数据的变化
在这里插入图片描述

缓存雪崩

缓存雪崩:当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,也会给后端系统(比如DB)带来很大压力。
解决方式:分散过期时间,让所有的key不在通一个时间点失效,分批量过期。
如若到了一个时间点必须更新过期数据用新数据替换则用强击穿方案去实现,先有一个去请求新数据把老数据替换下来,剩下的再去请求就会获取新数据了从redis;如果不强制要求时点性,则设置随机过期时间,
在这里插入图片描述

分布式锁

redis实现分布式锁的原理是使用setnx,不存在则新建,可以设置过期时间防止线程挂掉造成死锁,防止别的请求一直阻塞;还可以多线程维护延迟锁过期时间。。。。。

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值