Redis缓存穿透、缓存击穿、缓存雪崩

缓存思想

  Redis常作为主数据库的缓存使用:主数据库为Mysql、Oracle等,数据最终都会落地在主数据库中,而Redis用作数据缓存,用于数据的高效读取,当有数据查询请求进来时,内部逻辑如下:

在这里插入图片描述

  使用这种缓存架构,给系统的数据交互效率带来了一定的提升,但同时也引发了一些需要注意的问题。

缓存问题

1.缓存穿透

  缓存穿透是指查询目标为Redis缓存和数据库中都没有的数据,比如查询id为-1的数据,如果id从0开始,那这个查询请求则会分别查询Redis与数据库,然后返回空。如果出现大量的这类恶意请求,则会给系统带来很大的压力。

  对于这缓存穿透问题,有如下解决方案:

  • 1.对空值也在Redis进行缓存,从而不会继续访问数据库
  • 2.设置白名单,防止恶意ip的攻击
  • 3.采用布隆过滤器,在查询缓存与数据库前先进行一遍校验
  • 4.报警…真遭遇黑客攻击,可以联系网警解决

2.缓存击穿

  缓存穿透是指查询目标在Redis缓存中没有,但在数据库中存在的数据,一般是key值过期了,但还在被不断的高并发访问。

  对于这缓存击穿问题,有如下解决方案:

  • 1.提前将即将到来的热门数据缓存至Redis中。
  • 2.实时调整数据的过期时间,评估会长期用到的数据,可以延长失效时间为几天或者永不过期。
  • 3.使用锁,当第一个请求读取数据库完成前,其他相同请求都延迟等待,等第一个请求读取完成并将数据缓存至Redis后,其他相同请求才会继续执行。

3.缓存雪崩

  缓存击穿常发生在某一个key值过期时,而当有多个key值同时过期了,所有的查询则直接到达数据库层,db可能无法承受如此大的压力导致系统崩溃,这就是缓存雪崩。

  对于这缓存雪崩问题,有如下解决方案:

  • 1.设置多级缓存架构,如nginx缓存+redis缓存+其他缓存。
  • 2.将缓存失效时间分散开,避免大量key在同一时间失效。
  • 3.设置自动任务,在缓存失效前,对有必要的缓存数据提前更新。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值