缓存击穿,穿透,雪崩

击穿,穿透,雪崩都是在高并发前提下,当缓存中某一个热点key过期或key被淘汰导致的

1、缓存击穿

穿透和雪崩针对的是大面积数据请求,击穿是一个key导致的redis异常。但某个key是非常热点,请求非常频繁,处于集中式访问现象,当这个key失效(过期)时,大量的请求就会直接请求数据库,不同场景下缓存击穿解决方案

  • 数据基本不变:热点数据value基本不更新时,可以设置成永不过期
  • 使用锁:当发现缓存失效的时候,不是立即从数据库加载数据。先获取分布式锁,获取锁成功才执行数据库查询和写数据到缓存的操作,获取锁失败,则说明当前有线程在执行数据库查询操作,当前线程睡眠一段时间在重试,这样就只有一个请求去数据库读取数据,
    • 伪代码:
    •   
  • 数据更新频繁:用定时任务,在缓存过期前主动重新构建缓存或延长过期时间,保证所有的请求能一直访问缓存 

2、缓存穿透

缓存穿透是指缓存和数据库中都没有的数据,用户(黑客)不断发起请求,导致请求直接查询数据库,这种恶意行为攻击场景的会直接导致数据库挂掉,可以采取以下方案解决:

  • 在请求接口层可以做一些校验,比如用户签权、参数校验,不合法的请求直接return,
  • 当请求的数据不存在Redis也不存在数据库的时候,设置一个默认占位符(比如:None)。当后续再次进行查询则直接返回该占位符即可
  • 采用redis的高级接口Bloom Filter,在数据写入数据库的同时将这个ID同步到到布隆过滤器中。 布隆过滤器底层基于bitmap,在查询时能快速判断出你这个Key是否存在于数据库中,不存在你 return 就好了,存在你就去查DB再return。布隆过滤器有一定误判率,即判断某个key存在,但它实际不存在。对于BloomFilter判断不存在的 key ,则是100%不存在的。

3、缓存雪崩

假设A系统每秒需要处理5000个请求,但数据库每秒只能处理4000个请求,

如果出现以下几种情况:

  • 大量热点数据同时过期,导致大量请求需要查询数据库并写到缓存;
  • Redis 故障宕机,缓存系统异常。

这时候所有请求一下子全部落在数据库上,数据库肯定扛不住,从三个方面解决问题,

  • 过期时间添加随机值:要避免给大量数据设置一样的过期时间,过期时间 = baes 时间+ 随机时间(较小的随机数,比如随机增加 1~5 分钟)。这样一来,就不会导致同一时刻热点数据全部失效,同时过期时间差别也不会太大
  • 事故前:redis高可用方案,主从+哨兵,集群方案,避免全盘崩溃
  • 事故中:较少数据库的压力,本地cache缓存+限流及降级,当访问的不是核心数据的时候,在查询的方法上加上接口限流保护。避免超过数据库承受压力
  • 事故后:做redis持久化,一旦Redis重启,可从磁盘中快速恢复数据

改造后的数据流程:假设用户A发送一个请求,系统先请求本地cache是否有数据,如果没有再去Redis请求数据,如果没有再去数据库请求数据,获取到数据后同步到本地cache和redis。限流组件可以设置每秒请求数次,有多少通过请求,剩余的未通过的可以走降级处理,返回一些默认的值。高峰时期部分请求可能无法处理到,需要用户多次点击,因为只有不发请求被处理,剩下的请求被限流,需要多点击几次

 

总结:

缓存击穿(失效)指的是数据库有数据,缓存本应该也有数据,但是缓存过期了,Redis 这层流量防护屏障被击穿了,请求直奔数据库

缓存穿透指的是数据库本就没有这个数据,请求直奔数据库,缓存系统形同虚设

缓存雪崩指的是大量的热点数据无法在 Redis 缓存中处理(大面积热点数据缓存失效、Redis 宕机),流量全部打到数据库,导致数据库极大压力。

posted @   MarkLeeBYR  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示