Redis的缓存穿透、缓存击穿和缓存雪崩问题

缓存穿透:

关注点:要查询的数据缓存中没有,数据库中也没有

情景:就是在使用了缓存的基础上,去查询一个缓存中没有,数据库中也没有的空数据,也就是压根不存在的数据
如果被人写一个程序去频繁的调用这个查询空数据的请求,那么就有可能把数据库搞崩溃

解决方案:
1)缓存空对象:
第一次查询缓存中没有,去查询数据库也没有,然后我们把查询关键字当做缓存的key,然后对应的value用空对象代替,然后将这条数据加入到缓存中,下次再来相同查询的时候,就不再查询数据库了,而是去查询缓存,返回缓存中的空对象
2)布隆过滤器

步骤一:启动的时候,根据查询关键字,查询数据库中对应关键字的所有信息,添加到布隆过滤器中

步骤二:然后在查询缓存之前先去查询布隆过滤器,先去判断查询的值是否存在,如果判断为否,那么肯定数据库中不存在,那么直接返回错误信息或者提示信息,就不会再去查询缓存和数据库,相当于只是启动时候只去查询了一次数据库,用于布隆过滤器中值的写入
(当然存在误判,但是误判无所谓,已经削减了大量的请求,误判少量的请求,那也是少量的去查询数据库)

布隆过滤器可以参考集合的概念,但是跟集合不同的地方,或者说它的底层实现是位数组(每个位的值只有0和1,占用空间小,那么可以存储的就大),然后它的实现就是当你往布隆过滤器中插入一个数据的时候,他会根据你设置的要插入的总的数据量size和容错率fpp去计算生成的位数组的长度和(用于计算怎么将存储的数据存储到位数组哪些数组下标位置的)hash函数个数,然后你去查布隆过滤器中有没有该数据的时候,它就会拿相同的hash函数去计算数组中存储该数据的数组下标位置,然后去判断是否和插入时的一样,来判断是否可能存在,为什么说可能存在呢,因为存在hash碰撞导致误判,这个误判率和数组长度和容错率有直接关系(你容错率越低,hash函数越多,数组长度越大,那么产生hash碰撞误判的几率就越小,判断是否存在的准确性就越高,但是所需的空间资源也就越多)
在这里插入图片描述

缓存击穿:

关注点:要查询的数据缓存中没有,数据库中有(并发情况下)

情景:当高并发的情况下,n多个线程去查询数据,先查询Redis,正好查询的值过了过期时间,值被清除,那么Redis查不到了,就去MySQL数据库中查,那么n多个线程请求都将直接打到MySQL数据库上

解决方案:加分布式锁
比如99个人并发去访问查询同一个数据,第一步都去查询了缓存,缓存中没有,没有命中缓存,然后加分布式锁,其中一个访问线程持有了这个锁,然后其他线程阻塞,然后持有锁的线程又去查询一次缓存(这个是为了释放锁后,其他第一次查询缓存没有命中的阻塞的线程,等第一个线程查询完,写入缓存并且释放锁资源之后,阻塞线程被唤醒,然后不是去查询数据库,而是去查询缓存),缓存中没有,然后查询数据库,将查询到的数据写入Redis缓存,并且释放锁资源,其他阻塞线程被唤醒,然后去查询缓存,而不是查询数据库

缓存雪崩:

关注点:Redis中大量的值失效

情景:
Redis缓存宕机
或者你多个值设置了同一个过期时间,导致过期时间后,大量值失效

对应解决方案:
高可用Redis集群;
设置过期时间时有差值,避免设置大量的相同的过期时间

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值