浅谈 redis 缓存雪崩 缓存击穿 缓存穿透

在我们日常的开发中,涉及到涉及高并发大数据量的需求,经常需要使用redis作为缓存,但是可能出现缓存雪崩,缓存穿透,缓存击穿等问题,这里我简单举例讲下问题原因和解决方法。

缓存雪崩

假设我新开了一个网站,第一天有一些人来访问,我也挺开心,但是我忽视了一个情况,今天访问建立的缓存也差不多在同一时间失效,而且以后访问的人会更多,此时大量的请求会全部冲击到数据库上面,数据库有可能会因为承受不住而宕机。
当缓存服务器重启或者大量缓存集中在某一个时间段失效,叫做缓存雪崩。

解决方案

  1. 不同的key,设置不同的 过期时间 。比如在默认过期时间后面加上0-10分钟的 随机值 ,避免集体失效。

  2. 设置 二级缓存 ,过期时间增长一倍。如果原缓存过期就触发通知另外的线程在后台去更新实际缓存,同时返回二级缓存里的旧数据。

  3. 数据预热。在正式部署之前,提前将相关的数据直接加载到缓存,上线后定时任务去刷新。

缓存击穿

假设我的网站有一个大明星写的博文,很多人慕名而来就是为了看他,当他的相关缓存过期瞬间,可能会有很多请求到数据库上。
单个热点数据在过期时被高并发访问,叫做缓存击穿。

解决方案

  1. 设置 热点数据 永远不过期。
  2. 在缓存失效后,通过加 互斥锁 来控制读数据库写缓存的线程数量。当一个线程发现key失效时,给key加锁同时去数据库取值,其他线程来读取时就不会访问数据库而是排队等待,这里的锁必须要设置过期时间,否则万一这个取值的线程挂了就永久阻塞了。

缓存穿透

假设我没有设置好防火墙,黑客使用postman等工具恶意请求不合理数据,比如id = -1,缓存不可能存在这样的数据,每次都去数据库取值,不断攻击会导致数据库压力过大,甚至击垮数据库。
key对应的数据不存在,绕过缓存请求到数据库,叫做缓存穿透。

解决方案

  1. 在服务器配置 防火墙,管理和监测同一个ip大量访问的非法行为。对不同ip难以奏效。
  2. 在接口层增加 校验。比如用户鉴权校验,参数校验,过滤不合法的参数。
  3. 数据库取不到,仍然把这个 空结果 进行缓存,短时间将value设置为null,缺点是可能缓存很多空值,也会影响数据的一致性。
  4. 布隆过滤器。将所有可能存在的数据哈希到一个足够大的bitmap中,可以通过不同位是否为1直观判断这个数据是否存在,若有一位为0就肯定没有,直接return不访问数据库。缺点是当总数据量很大时,布隆过滤器也会很长,另外也不是绝对准确,有可能数据不存在而所有位被其他数据值置为1的情况。

总结

“道高一尺魔高一丈”,当然我们还可以利用redis高可用特性搭建 集群,或者当访问量剧增,服务出现问题时,为了保证核心服务还是可用的,非必须服务返回一些默认的值,或者友情提示,让用户再次刷新。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值