Redis缓存中的雪崩击穿穿透

专题文章 云天 8个月前 (09-15) 456次浏览 0个评论

Redis缓存中的雪崩、击穿和穿透

Redis作为缓存中间件使用时,会存在三种缓存失效导致的异常情况,分别时雪崩、击穿和穿透。

  1. Redis雪崩是指Redis故障,或者大量缓存同时失效的场景,大量缓存同时失效后,会导致本应访问缓存的请求直接访问数据库,导致数据库压力突增。解决方法如下:

    大量缓存同时失效:

    • 发生雪崩的原因时大量缓存同时失效,那么解决方法之一就是不使缓存同时失效,也就是为缓存设置不同的过期时间。
    • 使用互斥锁可以解决此问题,当雪崩发生时,使用互斥锁保证只有一个请求可以访问到数据库,这个请求从数据库中获取到数据后,返回请求并且将数据加入到缓存中,后续的请求可以直接访问新加载的缓存,避免数据库接收到大量请求。
    • 使用分级缓存,同时使用分布式缓存和本地缓存,请求优先访问本地缓存,如果获取不到数据,再去远程分布式缓存数据库获取数据,如果分布式数据库没有数据,再去数据库获取数据,读取到数据后分别同步到本地和远程缓存。
    • 使用缓存预热,在系统刚启动时加载部分数据到缓存中,避免系统刚启动时缓存中没有数据导致的雪崩。

    Redis故障:

    • 服务熔断:暂停业务的返回数据,直接返回错误。
    • 构建集群:构建多个Redis集群保证高可用。
  2. Redis击穿是指某一个热点缓存失效,导致对于该缓存的大量请求直接访问数据,使得数据库压力增大。Redis击穿可以认为是雪崩的子集,所以可以使用雪崩中的部分解决方法:
    • 加互斥锁,使用互斥锁保证只有一个访问抵达数据库且构建缓存,后续请求直接访问第一个请求构建好的缓存,避免此发生击穿现象。
    • 热点数据永不过期,不给热点数据设置过期时间,避免过期失效。
  3. Redis穿透,是指攻击者使用一个数据库中不存在的数据访问数据库,因为数据库中不存在,Redis缓存中自然也不存在,请求会直接发送到数据库,且因为数据库中不存在该数据,导致请求第一次发送到数据库时,不会加载到缓存中,导致每次该请求都会打到数据库上,造成数据库压力增大甚至宕机。解决方法如下:
    • 将攻击者ip加入访问黑名单,从源头避免访问,但是只能在攻击发生后处理,无法预知攻击者ip
    • 另一种有效的方式是,将数据库不存在的数据也加入到缓存中,如空值等,且设置较短的访问时间(为什么?)
    • 使用布隆过滤器,请求抵达时,先使用布隆过滤器快速判断数据是否存在,不存在直接返回,如果数据存在则允许访问缓存和数据库,直到获取到数据后返回。
喜欢 (1)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址