Redis缓存穿透,缓存击穿,缓存雪崩缘由与解决方案

Redis缓存穿透,缓存击穿,缓存雪崩缘由与解决方案

1. Redis缓存穿透,缓存击穿,缓存雪崩

缓存穿透:key对应的数据在数据源并不存在,每次针对此key的请求从缓存获取不到,请求都会到数据源,从而可能压垮数据源。好比用一个不存在的用户id获取用户信息,不论缓存仍是数据库都没有,若黑客利用此漏洞进行攻击可能压垮数据库。redis

缓存击穿:key对应的数据存在,但在redis中过时,此时如有大量并发请求过来,这些请求发现缓存过时通常都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。数据库

缓存雪崩:当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,也会给后端系统(好比DB)带来很大压力。后端

2. 解决方案

1. 缓存穿透

一个必定不存在缓存及查询不到的数据,因为缓存是不命中时被动写的,而且出于容错考虑,若是从存储层查不到数据则不写入缓存,这将致使这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。缓存

有不少种方法能够有效地解决缓存穿透问题最多见的则是采用布隆过滤器,将全部可能存在的数据哈希到一个足够大的bitmap中,一个必定不存在的数据会被 这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。服务器

另外也有一个更为简单粗暴的方法(咱们采用的就是这种),若是一个查询返回的数据为空(无论是数据不存在,仍是系统故障),咱们仍然把这个空结果进行缓存,但它的过时时间会很短,最长不超过五分钟。并发

2. 缓存击穿

key可能会在某些时间点被超高并发地访问,是一种很是“热点”的数据。这个时候,须要考虑一个问题:缓存被“击穿”的问题。高并发

业界比较经常使用的作法,是使用互斥锁。简单地来讲,就是在缓存失效的时候(判断拿出来的值为空),不是当即去load db,而是先使用缓存工具的某些带成功操做返回值的操做(好比Redis的SETNX或者Memcache的ADD)去set一个mutex key,当操做返回成功时,再进行load db的操做并回设缓存;不然,就重试整个get缓存的方法。工具

3. 缓存雪崩

有一个简单方案就时将缓存失效时间分散开,好比咱们能够在原有的失效时间基础上增长一个随机值,好比1-5分钟随机,这样每个缓存的过时时间的重复率就会下降,就很难引起集体失效的事件线程

缓存标记:记录缓存数据是否过时,若是过时会触发通知另外的线程在后台去更新实际key的缓存队列

关于缓存崩溃的解决方法,三种方案:使用锁或队列、设置过时标志更新缓存、为key设置不一样的缓存失效时间,还有一种被称为“二级缓存”的解决方法。

相关文章
相关标签/搜索