redis缓存穿透,缓存雪崩,缓存击穿

首先他们都会导致缓存失效。

缓存穿透

概念

是指查询了一个一定不存在的数据,由于缓存没有并发,将去查询数据库,但是数据库也没有,这将导致这个不存在的数据每次请求到要去数据库中查询,失去了缓存的意义。 (访问null数据)
风险:利用不存在的数据进行攻击,数据库压力瞬时过大,最终导致崩溃。

解决方案

1、null结果缓存,并加入短暂过期时间;
2、使用布隆过滤器(布隆过滤器通过一组哈希函数对请求数据进行计算,判断数据是否可能存在)

缓存雪崩

概念

是指我们设置缓存时key采用了相同的过期时间,导致缓存在某一时刻同时失效,请求全部被转发到数据,数据库压力过大。(大面积的key同时失效)

解决方案

1、对于部分数据不设置过期时间
2、使用sprincloud的服务限流熔断
3、搭建可用高的redis集群
4、过期时间设置成随机值。(要注意随机值尽可能离散)
5、设计多级缓存,如本地缓存,nginx缓存
6、缓存预热
批量预加载数据,在系统启动或服务重启时,可以批量查询数据库并将结果存入缓存中。这种方式适用于
数据量相对固定且比较小的情况。比如:常用的字典配置信息。

异步预热,如果预热的数据量很大,或者预热过程比较耗时,可以考虑使用异步任务来执行预热操作。这样可以避免阻塞系统启动,并且可以利用系统的空闲时间来预热缓存。

定时任务预热,对于某些周期性变化的数据,可以用定时任务来定期预热缓存。例如,对于每天更新的数据,可以在每天的某个固定时间执行预热操作。

缓存击穿

概念

是指对于一些设置了过期时间的key,在某些时间点被高频的访问,如果这个key在大量请求同时进来时失效,那么所有的请求都会落到数据库。(热点数据被高频访问前失效)

解决方案

1、对于热点访问的数据不加过期时间。
2、加锁,大量并发只让一个去查询,其他请求等待,查询到以后,放入缓存在释放锁,其他请求获取到锁后,先去查缓存。(要注意为锁设置一个合理的过期时间,避免死锁问题)

  • 17
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值