美文网首页
Redis的缓存穿透、缓存击穿和雪崩

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

作者: Lnstark | 来源:发表于2020-11-25 23:20 被阅读0次

1. 缓存穿透

要查询的数据在数据源并不存在,每次针对此key的请求从缓存获取不到,请求都会到数据源,从而可能压垮数据源。

解决方式:

1.布隆过滤器。原理就是对库里所有的数据通过同一组hash算法散列到一个bitmap0里,对于一个新元素,它经过该组hash算法之后的得到的bitmap1中,如果有一个bitmap0对应位是0的位为1,那么该元素一定不存在数据库里。所以当布隆过滤器判断出该元素不在数据库里的时候是不会误判的,然而它不能确定该元素是否真的在库里。

2.将查出来是null的结果Key也缓存到redis里,设置一个较短的过期时间。

2. 缓存击穿

某一个key的缓存过期时,大量对数据库的访问对数据库会造成很大的压力。

解决方式:

采用锁(java内置锁或分布式锁)的方式进行同步。
先从redis里拿数据,如果有数据直接返回,如果没有,加锁。如果拿到锁,到库里拿数据塞到redis里然后解锁。如果没拿到锁,等待一小段时间后再次重复上述步骤。

3. 缓存雪崩

当多个redis key都失效,例如redis重启或者大量缓存在同一时间失效时,大量的访问也会对数据库造成很大压力。区别于缓存击穿的就是雪崩是很多个key失效,击穿是1个key失效。

解决方法:

  1. 加锁限制数据库的并发量,但是会影响效率。
  2. 为key设置不同的缓存失效时间
  3. 设置缓存过期标志,缓存快过期时去刷新缓存

参考原文
REDIS缓存穿透,缓存击穿,缓存雪崩原因+解决方案

相关文章

网友评论

      本文标题:Redis的缓存穿透、缓存击穿和雪崩

      本文链接:https://www.haomeiwen.com/subject/pgsoiktx.html