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

打印 上一主题 下一主题

主题 860|帖子 860|积分 2580

概述

缓存击穿、缓存穿透、缓存雪崩这三个题目是Reids在实际项目中会经常遇到题目,同时,这三个题目也是口试的热点题目,下面,就本篇文章搞懂缓存穿透、缓存击穿、缓存雪崩三大题目标原因及解决方法。
Redis在项目中作为缓存中心件是如何工作的?如图所示

客户端发起一个查询请求的时候,首先去缓存中查询,如果数据在缓存中存在,则直接将缓存中的数据返回给客户端;如果数据在缓存中不存在,则继续查询数据库,如果数据在数据库中存在,则将该数据放入缓存中,并返回给客户端,如果数据在数据库中也不存在,则直接返回null给客户端。
1.缓存穿透

1.1 什么是缓存穿透

缓存穿透是指查询一个缓存中和数据库中都不存在的数据,导致每次查询这条数据都会透过缓存,直接查库,末了返回空。当用户使用这条不存在的数据疯狂发起查询请求的时候,对数据库造成的压力就非常大,甚至大概直接挂掉。这种情况的流程就变成下图如许了:

1.2 解决方案

解决缓存穿透的方法一般有两种,第一种是缓存空对象,第二种是使用布隆过滤器。
1.2.1 缓存空对象

第一种方法比较好明白,就是当数据库中查不到数据的时候,我缓存一个空对象,然后给这个空对象的缓存设置一个过期时间,如许下次再查询该数据的时候,就可以直接从缓存中拿到,从而到达了减小数据库压力的目标。
但这种解决方式有两个缺点:
(1)需要缓存层提供更多的内存空间来缓存这些空对象,当这种空对象许多的时候,就会浪费更多的内存;
(2)会导致缓存层和存储层的数据不一致,即使在缓存空对象时给它设置了一个很短的过期时间,那也会导致这一段时间内的数据不一致题目。
1.2.2 布隆过滤器

使用布隆过滤器,这是比较推荐的方法。所谓布隆过滤器,就是一种数据结构,它是由一个长度为m bit的位数组与n个hash函数组成的数据结构,位数组中每个元素的初始值都是0。在初始化布隆过滤器时,会先将全部key进行n次hash运算,如许就可以得到n个位置,然后将这n个位置上的元素改为1。如许,就相称于把全部的key生存到了布隆过滤器中了。
举个例子,好比我们一共有3个key,我们对这3个key分别进行3次hash运算,key1颠末三次hash运算后的效果分别为2/6/10,那么就把布隆过滤器中下标为2/6/10的元素值更新为1,然后再分别对key2和key3做同样操作,效果如下图:

如许,当客户端查询时,也对查询的key做3次hash运算得到3个位置,然后看布隆过滤器中对应位置元素的值是否为1,如果全部对应位置元素的值都为1,就证明key在库中存在,则继续向下查询;如果3个位置中有任意一个位置的值不为1,那么就证明key在库中不存在,直接返回客户端空即可。如下图:

当客户端查询key4时,key4的3次hash运算中,有一个位置8的值为0,就说明key4在库中不存在,直接返回客户端空即可。
所以,布隆过滤器就相称于一个位于客户端与缓存层中心的拦截器一样,负责判断key是否在集合中存在。如下图:

布隆过滤器的好处就是解决了第一种缓存空值的不敷,但布隆过滤器也存在缺陷,
首先,它有误判的大概,好比在上面客户端查询key4的图中,假如key4颠末3次hash运算得到的位置分别是2/4/6,由于这3个位置的值都是1,所以,布隆过滤器就认为key4在库中存在,进而继续向下查询了。所以,布隆过滤器判断存在的key实际上大概是不存在的,但布隆过滤器判断不存在的key是肯定不存在的。
它的第二个缺点就是删除元素比较难,好比现在要删除key2这个元素,那么需要将2/7/11三个位置的元素值改为0,但如许就会影响到key1和key3的判断。
2.缓存击穿

2.1 什么是缓存击穿

缓存击穿是指当缓存中某个热点数据过期了,在该热点数据重新载入缓存之前,有大量的查询请求穿过缓存,直接查询数据库。这种情况会导致数据库压力瞬间骤增,造成大量请求阻塞,甚至直接挂掉。

2.2 解决方案

解决缓存击穿的方法也有两种,第一种是设置key永不外期;第二种是使用分布式锁,保证同一时刻只能有一个查询请求重新加载热点数据到缓存中,如许,其他的线程只需等候该线程运行完毕,即可重新从Redis中获取数据。
2.2.1 热点Key值永不外期

第一种方式比较简单,在设置热点key的时候,不给key设置过期时间即可。不外另有别的一种方式也可以到达key不外期的目标,就是正常给key设置过期时间,不外在后台同时启一个定时任务去定时地更新这个缓存。

2.2.2 分布式锁并发更新

第二种方式使用了加锁的方式,锁的对象就是key,如许,当大量查询同一个key的请求并发进来时,只能有一个请求获取到锁,然后获取到锁的线程查询数据库,然后将效果放入到缓存中,然后释放锁,此时,其他处于锁等候的请求即可继续执行,由于此时缓存中已经有了数据,所以直接从缓存中获取到数据返回,并不会查询数据库。

3.缓存雪崩

3.1 什么是缓存雪崩

缓存雪崩是指当缓存中有大量的key在同一时刻过期,大概Redis直接宕机了,导致大量的查询请责备部到达数据库,造成数据库查询压力骤增,甚至直接挂掉。

3.2 解决方案

针对第一种大量key同时过期的情况,解决起来比较简单,只需要将每个key的过期时间打散即可,使它们的失效点尽大概均匀分布。
针对第二种redis发生故障的情况,部署redis时可以使用redis的几种高可用方案部署
除了上面两种解决方式,还可以使用其他策略,好比设置key永不外期、加分布式锁等。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

没腿的鸟

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表