Redis缓存击穿,传统,雪崩

前提是你 提交于 2020-02-15 06:06:35

Redis的三种常见的使用问题

  1. 缓存穿透(缓存的数据DB中不存在,缓存中也不存在。但是高频次的无结果查询全部落在DB上,从而影响DB性能)
  2. 缓存击穿(当热点数据发生过期时。高频次的访问全部落在DB上,从而影响DB性能)
  3. 缓存雪崩(和缓存穿透相似。很多的热点数据同一时间过期。)

缓存穿透

描述:

缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,进而给数据库带来压力。(来自百度百科)

解决方案:

1.缓存空值:

                   针对空结果查询进行数据缓存,将空结果存入缓存中(设置一个较短的随机过期时间)。

2.布隆过滤器:

                   是一种较为特殊的数据结构。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。

                  布隆过滤器的简单介绍:他是将每一个key进行hash 算法的,然后存入一个二进制数组当中。

                  举例:(假设我们这个布隆过滤器的二进制数组只有10个长度)

  •                 (我们首先将Alibaba加入到缓存当中)
  •                   Alibaba ==hash==> 378 (我们将Alibaba进行hash计算后得到378)
  •                   [0,1,2,3,4,5,6,7,8,9] (我就是一个数组下标,怕各位客官数乱了。)
  •                   [0,0,0,1,0,0,0,1,1,0]  (然后我们将3,7,8对应到数组中,将这几位标记为1。)
  •                 (我们再将Baidu加入到缓存当中)
  •                   Baidu   ==hash==>  279   (我们在将Baidu进行hash计算得到279)
  •                   [0,0,1,1,0,0,0,1,1,1]  (然后我们将2,7,9也对应到数组中,将这几位也标记为1。)
  •                 (如果这个时候Tencent过来进行查询)
  •                   Tencent   ==hash==>  359   (我们在将Tencent进行hash计算得到359)
  •                   [0,0,1,1,0,0,0,1,1,1]  (然后我们将3,5,9在数组中进行查询,发现第5位是0,未进行赋值,我们就可以认为                            Tencent这个数据一定不在缓存中也一定不在DB当中,可以直接返回空了。)

缓存击穿

描述:

缓存击穿是指热点key在某个时间点过期的时候,而恰好在这个时间点对这个Key有大量的并发请求过来,从而大量的请求打到db。(来自百度百科)

解决方案:

1.后台刷新缓存:启动一个后台的定时任务来更新Key,从而变相的保证了Key 的永不过期。但是实际操作起来的时候维护相对比较困难。(不推荐)

2.加锁:当缓存过期时,增加分布式锁。来确保在多个访问中只有一个请求可以请求到DB,其余的请求等待缓存更新后再次获取缓存,来确保DB的安全。这个做法也有很多的缺点,当访问DB 的时候其他的请求都在等待,这样的用户感受就很不友好。并且,如此多的请求堆积,还可能引起更多莫名其妙的问题,例如OOM等等。(不推荐)

3.标记更新:在缓存当中额外增加一个逻辑的更新时间。当访问到这个缓存时,如果逻辑更新时间到达时,就去更新这个缓存。但是这中方式同样会导致,缓存击穿。(不推荐)

4.加锁+二级缓存:针对热点数据增加两个缓存。一级缓存可以按照缓存的正常过期时间相对缩短一点,二级缓存(可以根据需求判断是否允许支持短暂的缓存不一致,来决定缓存的时间长短)设置一个长于一级缓存的时间。当一级缓存过期时,进行添加分布式锁,来保证只有一次DB的访问,然后同时更新两级缓存。其他的未获得锁的访问直接访问二级缓存。(推荐)

缓存雪崩

描述:

缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机。(来自百度百科)

解决方案:

首先需要借助缓存击穿,解决方案。针对热点数据进行二级缓存和加锁,防止影响DB。

然后针对大部分缓存的集中性过期,进行分散过期时间。对缓存的正常过期时间,增加随机数。来确保缓存的分散性过期。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!