Redis-缓存雪崩、缓存穿透、缓存击穿的理解以及如何避免?

221 阅读3分钟

缓存雪崩

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第4天,点击查看活动详情

(1)什么是缓存雪崩

缓存雪崩就是存储在缓存里面的大量数据在同一个时刻全部过期,原本缓存组件能够扛住大部分流量,全部请求到了数据库,从而导致数据库压力增加,造成数据库服务器的崩溃一种现象。

1.jpg

(2)导致缓存雪崩的原因

  1. 中间件宕机(可以对缓存中间件做高可用来避免)
  2. 缓存中大部分key都设置了相同的过期时间(可以在失效时间里面去增加1-5分钟的随机值,避免同时失效的问题)

缓存穿透

(1)什么缓存穿透

缓存穿透表示段时间内有大量的不存在key请求到应用程序里面,而这些不存在key,在缓存里面又找不到,从而导致全部的请求,全部穿透到了数据库,造成数据库压力增加

(2)造成缓存穿透的核心问题

缓存穿透的核心问题针对缓存的一种攻击行为,正常业务里面,即便是出现这样一个不存在key的情况,由于缓存的不断预热影响也不会很大,而攻击行为呢,就需要去具备时间的持续性,而只有key确定在数据库里面不存在的情况下,才能达到这样一个目的

(3)怎么解决缓存穿透

把无效的key保存到redis里面,并且设置一个特殊的值,比如像“null”字符串,下次再来访问的时候,就不会查询数据库了

2.jpg 但是如果攻击者不断的用随机不存在的key来访问,也还是会存在相同的问题, 可以使用布隆过滤器来实现,在系统启动的时候,我们可以把目标数据全部缓存到布隆过滤器 当攻击者去使用不存在key来请求的时候,先到布隆过滤器去进行查询,如果不存在就意味着这个可以肯定在数据库里面也不存在,这个时候就不会去访问数据库,布隆过滤器还有个好处,它采用的是bitmap,也就是位图来进行数据存储,它的占用空间是很小的

缓存击穿

(1)什么缓存击穿

缓存击穿是指一个 key 非常热点。在不停的扛着大并发,大并发集中对这一个点进行访问,当这个 key 在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,造成数据库压力增加

(2)怎么解决缓存击穿

解决办法也不难,既然是热点 key,那么说明该 key 会一直被访问,既然如此,我们就不对这个 key 设置失效时间了,如果数据需要更新的话,直接重写缓存即可,这种解决方案只适用于不要求数据严格一致性的情况, 我在另一篇博客介绍了Redis和Mysql如何保证数据一致性