Redis缓存穿透,缓存击穿,缓存雪崩解决方案(常用方法,面试常问)。

1.缓存穿透

介绍:缓存穿透是指查询一个一定不存在的数据,这将导致这个不存在的数据每次请求都要到数据库去查询,可能导致数据库挂掉。

解决方案:

1.1布隆过滤器:

使用布隆过滤器来过滤掉那些明显无效的请求,从而减轻数据库压力,但是布隆过滤器是有缺点,存在一定的误判率,可以设置,最好5%以下。

布隆过滤器介绍:
布隆过滤器主要是用于检索一个元素是否在一个集合中。使用的是redisson实现的布隆过滤器。它的底层主要是先去初始化一个比较大数组,里面存放的二进制0或1。在一开始都是0,当一个key来了之后经过几次hash计算,模于数组长度找到数据的下标然后把数组中原来的0改为1,这样的话,三个数组的位置就能标明一个key的存在。查找的过程也是一样的。
为什么会出现误判率呢,因为key经过hash函数计算可能会出现哈希冲突,导致不同的key经过几次hash函数计算后得到的下标一样,这会导致在数据库不存在的key也能在布隆过滤器找到,同理,在删除布隆过滤器的时候,可能会删除同一个下标的key(误删),两个不同的key地址一样。

1.2.空值缓存:

对于查询结果为空的请求,可以将空值也缓存起来,即将键设置为对应的空值(如NULL),并设置适当的过期时间(防止存储太多的null值),这样下次请求相同的无效数据时可以直接从缓存返回NULL,而不是去查询数据库。

2缓存击穿

介绍:问题描述:缓存击穿是指某个热点数据kry过期或被删除,恰好大量请求同时访问这个热点数据,没有缓存就直接去访问数据库,使得数据库负载骤增。可能导致数据库挂掉。
解决方案:

2.1分布式锁

Redisson分布式锁,当大量请求到接口时,先判断有没有缓存了,没有的话,去获取分布式锁,只有一个请求能拿到锁,并可以去请求数据并把数据缓存到redis。其它请求就可以直接拿缓存返回了,不用去数据库拿数据了。

2.2 缓存设置为逻辑(永不)过期

1.在设置key的时候,设置一个过期时间字段一块存入缓存中,不给当前key设置过期时间
2.当查询的时候,从redis取出数据后判断时间是否过期
3.如果过期则开通另外一个线程进行数据同步,当前线程正常返回旧数据(返回之前的,不是最新数据)。

两种方法比较:
1.如果选择数据的强一致性,建议使用分布式锁的方案,性能上可能没那么高,也有可能产生死锁的问题
2.如果选择key的逻辑删除,则优先考虑的高可用性,性能比较高,但是数据同步这块做不到强一致。

3.缓存雪崩

缓存雪崩是指大量缓存数据在同一时间失效,导致大量请到数据库上请求数据,可能使数据库挂掉。
解决方案:

3.1 缓存设置随机的过期时间

在缓存数据的过期时间上增加一个随机的值,以分散缓存失效时间,避免大规模同时失效。

  • 18
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
缓存穿透缓存击穿缓存雪崩是常见的缓存相关问题,它们可能导致缓存失效或性能下降。下面是对它们的原因和解决方法的简要说明: 1. 缓存穿透缓存穿透是指请求的数据在缓存和数据库中都不存在,导致每次请求都要访问数据库,增加了数据库负载。主要原因是恶意攻击或错误的查询。 解决方法: - 使用布隆过滤器:在查询前使用布隆过滤器检查请求是否有效,如果无效则直接返回,避免对数据库的查询。 - 设置空对象缓存:将数据库中不存在的值也缓存起来,可以防止频繁查询。 2. 缓存击穿缓存击穿是指一个热点数据失效,导致大量请求同时访问数据库,造成数据库压力过大。主要原因是热点数据过期或删除。 解决方法: - 设置热点数据永不过期:针对热点数据设置永不过期,确保即使失效也能从缓存中获取,并在后台异步更新缓存。 - 互斥锁(Mutex):当缓存失效时,只允许一个线程访问数据库并更新缓存,其他线程等待获取缓存数据。 3. 缓存雪崩缓存雪崩是指缓存中大量的数据同时失效,导致所有请求都要访问数据库,造成数据库负载过大。主要原因是缓存中的数据同时过期。 解决方法: - 设置随机过期时间:为缓存数据设置随机的过期时间,避免大量数据同时失效。 - 使用分布式缓存:将缓存分布在不同的节点上,提高系统的可用性和容错能力。 - 数据预热:提前加载热点数据到缓存中,避免在高并发时突然访问数据库。 以上是对缓存穿透缓存击穿缓存雪崩问题的原因和解决方法的简要介绍,实际应用中可能还需要结合具体场景进行调整和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值