请选择 进入手机版 | 继续访问电脑版

[Redis] 详解Redis缓存穿透/击穿/雪崩原理及其办理 方案

[复制链接]
查看200 | 回复32 | 2021-9-14 02:08:14 | 显示全部楼层 |阅读模式
目次

1. 简介

如图所示,一个正常的哀求

详解Redis缓存穿透/击穿/雪崩原理及其办理
方案

1.客户端哀求 张铁牛的博客。

2.服务起首 会哀求 redis,查看哀求 的内容是否存在。

3.redis将哀求 效果 返回给服务,假如 返回的效果 有数据则实行

  1. 7
复制代码
;假如 没有数据则会继续往下实行 。

4.服务从数据库中查询哀求 的数据。

5.数据库将查询的效果 返回给服务。

6.假如 数据库有返回数据,则将返回的效果 添加到redis。

7.将哀求 到的数据返回给客户端。

2. 缓存穿透

详解Redis缓存穿透/击穿/雪崩原理及其办理
方案

2.1形貌

通过接口访问一个缓存和数据库都不存在的数据。

由于 服务出于容错思量 ,当哀求 从持久层查不到数据则不写入缓存,这将导致哀求 这个不存在的数据每次都要到持久层去查询,失去了缓存的意义。

此时,缓存起不到保护后端持久层的意义,就像被穿透了一样。导致数据库存在被打挂的风险。

2.2 办理 方案

1.接口哀求 参数的校验。对哀求 的接口举行 鉴权,数据合法性的校验等;比如查询的userId不能是负值或者包含非法字符等。

2.当数据库返回空值时,将空值缓存到redis,并设置合理的过期时间。

3.布隆过滤器。使用 布隆过滤器存储全部 大概 访问的 key,不存在的 key 直接被过滤,存在的 key 则再进一步查询缓存和数据库。

3. 缓存击穿

详解Redis缓存穿透/击穿/雪崩原理及其办理
方案

3.1 形貌

某个热门 key,在缓存过期的一瞬间 ,同时有大量的哀求 打进来,由于此时缓存过期了,以是 哀求 终极 都会走到数据库,造成瞬时数据库哀求 量大、压力骤增,导致数据库存在被打挂的风险。

3.2 办理 方案

1.加互斥锁。当热门 key过期后,大量的哀求 涌入时,只有第一个哀求 能获取锁并壅闭 ,此时该哀求 查询数据库,并将查询效果 写入redis后开释 锁。后续的哀求 直接走缓存。

2.设置缓存不过期或者后台有线程不停 给热门 数据续期。

4. 缓存雪崩

详解Redis缓存穿透/击穿/雪崩原理及其办理
方案

4.1 形貌

大量的热门 数据过期时间雷同 ,导致数据在同一时候 集体失效。造成瞬时数据库哀求 量大、压力骤增,引起雪崩,导致数据库存在被打挂的风险。

4.1 办理 方案

1.将热门 数据的过期时间打散。给热门 数据设置过期时间时加个随机值。

2.加互斥锁。当热门 key过期后,大量的哀求 涌入时,只有第一个哀求 能获取锁并壅闭 ,此时该哀求 查询数据库,并将查询效果 写入redis后开释 锁。后续的哀求 直接走缓存。

3.设置缓存不过期或者后台有线程不停 给热门 数据续期。

5. 布隆过滤器

5.1 形貌

布隆过滤器是防止缓存穿透的方案之一。布隆过滤器重要 是办理 大规模数据下不必要 准确 过滤的业务场景,如检查垃圾邮件地址,爬虫URL地址去重, 办理 缓存穿透题目 等。

布隆过滤器:在一个存在肯定 数量 的集合中过滤一个对应的元素,判断 该元素是否肯定 不在集合中或者大概 在集合中。它的长处 是空间服从 和查询时间都比一样平常 的算法要好的多,缺点是有肯定 的误辨认 率和删除困难。

5.2 数据布局

布隆过滤器是基于

  1. bitmap
复制代码
和多少 个
  1. hash算法
复制代码
实现的。如下图所示:

详解Redis缓存穿透/击穿/雪崩原理及其办理
方案

1.元素

  1. tie
复制代码
颠末
  1. hash1,hash2,hash3
复制代码
运算出对应的三个值落到了数组下标为
  1. 4,6,8
复制代码
的位置上,并将其位置的默认值
  1. 0
复制代码
,修改成
  1. 1
复制代码

2.元素

  1. niu
复制代码
同理落到了数组下标为
  1. 1,3,4
复制代码
的位置上,并将其位置的默认值
  1. 0
复制代码
,修改成
  1. 1
复制代码

此时

  1. bitmap
复制代码
中已经存储了
  1. tie
复制代码
  1. niu
复制代码
数据元素。

当哀求 想通过布隆过滤器判断

  1. tie
复制代码
元素在程序中是否存在时,通过
  1. hash
复制代码
运算效果 到数组对应下标位置上发现值已经都被置为
  1. 1
复制代码
,此时返回
  1. true
复制代码

5.3 “肯定 不在集合中”

详解Redis缓存穿透/击穿/雪崩原理及其办理
方案

如图所示:

​ 元素

  1. zhang
复制代码
通过布隆过滤器判断 时,下标
  1. 0,2
复制代码
都为
  1. 0
复制代码
,则直接返回
  1. false
复制代码

也就是当判断 不在

  1. bitmap
复制代码
中的元素时,颠末
  1. hash运算
复制代码
得到的效果 在
  1. bitmap
复制代码
中只要有一个为
  1. 0
复制代码
,则该数据肯定 不存在。

5.4 “大概 在集合中”

详解Redis缓存穿透/击穿/雪崩原理及其办理
方案

如图所示:

​ 元素

  1. shuaibi
复制代码
通过布隆过滤器判断 时,
  1. hash运算
复制代码
的效果 落到了下标
  1. 1,3,8
复制代码
上,此时对应下标位置的值都为
  1. 1
复制代码
,则直接返回
  1. true
复制代码

这下就尴尬了,由于 实际 程序中并没有数据

  1. shuaibi
复制代码
,但布隆过滤器返回的效果 表现 有这个元素。这就是布隆过滤器的缺点,存在误判环境 。

5.5 ”删除困难“

为什么布隆过滤器删除困难呢,如图所示:

详解Redis缓存穿透/击穿/雪崩原理及其办理
方案

假如 删除了“tie”元素,

  1. 4
复制代码
号位被置为
  1. 0
复制代码
,则会影响
  1. niu
复制代码
元素的判断 ,由于
  1. 4
复制代码
号位为
  1. 0
复制代码
,举行 数据校验时返回
  1. 0
复制代码
,则会以为 程序中没有
  1. niu
复制代码
元素。

  1. 那小伙伴会问,4号位不置为0,行不行?
  2. 如果删除了元素,hash碰撞的数组下标不置为0,那么如果继续验证该元素的话,布隆过滤器会继续返回true,但实际上元素已经删除了。
复制代码

以是 布隆过滤器数据删除困难,假如 要删除的话,可以参考

  1. Counting Bloom Filter
复制代码

5.6 为什么不使用 HashMap呢?

假如 用HashSet或Hashmap存储的话,每一个用户ID都要存成int,占4个字节即32bit。而一个用户在bitmap中只必要 1个bit,内存节省 了32倍。

并且大数据量会产生大量的hash冲突,效果 就是产生hash冲突的数据,仍旧 会举行 遍历挨个比对(即使转成红黑树),如许 对内存空间和查询服从 的提升 ,仍旧 是有限的。

当然:数据量不大时,只管 使用 。而且hashmap方便举行 CRUD

本帖子中包含更多资源

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

x
回复

使用道具 举报

avatar 塞上云烟辣 | 2021-9-18 03:38:26 | 显示全部楼层
吹牛的人越来越多了!
回复

使用道具 举报

avatar 一箫凝月黄 | 2021-9-20 06:51:28 | 显示全部楼层
admin楼主的头像能辟邪啊!
回复

使用道具 举报

avatar 登州渔夫 | 2021-9-21 15:54:04 | 显示全部楼层
精华帖的节奏啊!
回复

使用道具 举报

avatar 李悔之2015 | 2021-9-21 15:54:08 | 显示全部楼层
楼上的很有激情啊!
回复

使用道具 举报

avatar 嗅觉Y不缺失 | 2021-9-26 18:26:55 | 显示全部楼层
收藏了,改天让朋友看看!
回复

使用道具 举报

avatar 塞上云烟辣 | 2021-9-28 00:09:31 | 显示全部楼层
视死如归的架势啊!
回复

使用道具 举报

avatar 小仙女要起飞 | 2021-10-3 12:54:37 | 显示全部楼层
admin楼主的帖子实在是写得太好了。文笔流畅,修辞得体!
回复

使用道具 举报

avatar 封号955 | 2021-10-12 04:34:55 | 显示全部楼层
楼上的别说的那么悲观好吧!
回复

使用道具 举报

avatar SUNSHINEhzl | 2021-10-17 20:25:11 | 显示全部楼层
每天顶顶贴,一身轻松啊!
回复

使用道具 举报

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

本版积分规则