Redis缓存穿透\击穿\雪崩

redis缓存穿透(查不到)

 概念

在默认的情况下,用户请求数据时,会先在缓存当中查找,若没有找到缓存即缓存未命中,数量少可能问题不大,可是一旦大量的请求数据(例如秒杀场景)缓存没有命中的话,就会转移到数据库上,造成数据库极大的压力,就有可能导致数据库崩溃,网络安全当中也有人恶意使用这种手段进行攻击被称为洪水攻击.

解决方案:

布隆过滤器

对所有可能查询的参数以Hash形式存储,以便快速确定存在这个值,在控制层先进行拦截校验,校验不通过则直接打回,减轻了存储系统的压力.

在这里插入图片描述

缓存空对象

一次请求若在缓存当中和数据库当中都没有找到的话,就在缓存当中用一个空对象用于处理后续的这个请求.

在这里插入图片描述 

这样做有一个缺陷:寸触控对象也是需要一定的内存空间,大量的空对象会耗费一定的空间,存储效率并不高,解决这个缺陷的方式就是设置较短的过期时间,即使对空值设置了过期时间,还是会存在缓存层和存储层的数据会有一段时间窗口不一致,这对于需要保持一致性的业务会有影响.

缓存击穿(量太大,缓存过期) 

概念:

相较于缓存穿透,缓存击穿的目的性更强,一个存在的key,在缓存过期的那一刻,同时有大量的请求,这些请求都会击穿到DB层,造成瞬时的DB请求量大,压力骤增,这就是缓存击穿,只是针对其中某一个key的缓存过期或者不可用而导致击穿,但是其他的key依然可以使用缓存响应.

比如热搜上的一个热点同时被大量访问就可能导致缓存击穿,

解决方案:

设置热点数据永不过期

这样就不会出现热点数据过期的情况,但是Redis内存空间满的时候也会清理部分数据,而且此方案会占用空间,一旦热点数据多了起来,就会占用部分空间

加互斥锁(分布式锁)

 在访问key之前,采用setnx来设置另一个短期key来锁住当前key访问,访问结束后再删除短期的key,保证同时刻只有一个线程访问,这样对锁的要求就十分高.

缓存雪崩

概念:

大量的key设置了相同过期时间,导致在缓存在同一时刻全部失效,造成瞬时DB请求量大.压力骤增,引起雪崩,

在这里插入图片描述 

 解决方案:

redis高可用

这个思想的含义就是,既然redis有可能挂掉,那我就多增几台redis,这样一台挂掉之后其他的还可以继续工作,其实就是搭建的集群

限流降级

这个解决方案的思想是,在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量,比如对某个key只允许一个线程查询数据和写缓存,其他线程等待

数据预热

数据预热的含义就是在正式部署之前,我先把可能的数据先预先访问一遍,这样部分可能大量访问的数据就会加载到缓存当中.在即将发生大并发访问前手动触发加载缓存不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值