三句话搞懂Redis-缓存穿透、击穿、雪崩

前言

如何有效的理解并且区分 Redis 穿透、击穿和雪崩之间的区别,一直以来都挺困扰我的。特别是穿透和击穿,过一段时间就稀里糊涂的分不清了。

为了有效的帮助自己,以及拥有同样烦恼的朋友们区分这三种场景。我总结了一些关键词,希望大家可以和我一样通过联想的方式来区分并理解这三种场景的区别!

一. 缓存穿透

关键词:穿过 Redis 和数据库

当 Redis 和数据库中都没有我们想要的数据时,就需要考虑缓存穿透的问题了。下面这段逻辑大家用的会比较多:先去 Redis 中查找某资源,Redis 中查不到就去 DB 中查,DB 中查到后回写一份数据到 Redis 中。

三句话搞懂Redis-缓存穿透、击穿、雪崩_第1张图片

这段逻辑正常情况下问题并不大,但是如果用户恶意重复请求资源 X,该资源在 Redis 和 DB 中都不存在。那么每次请求都会直接打到 DB 上,甚至导致物理 DB 宕机。

解决方案

  1. 缓存空结果

如果系统发现 Redis 及 DB 中都不存在该资源,就缓存空结果一段时间。需要注意哈,这次的失效时间不能设置的太长,否则数据的实效性会产生很大的问题。

  1. 用户合法性校验

对用户的请求合法性进行校验,拦截恶意重复请求。

  1. 布隆过滤器

看到这个名词不要慌。简单来说布隆过滤器的用途就是帮助你判断某个值是否存在。

布隆过滤器(英语:Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。

把数据库中的数据的key都在布隆过滤器中过一遍,能帮助我们挡掉大部分不存在的key的请求

二. 缓存击穿

关键词:定点打击

试想如果所有请求对着一个 key 照死里搞,这是不是就是一种定点打击呢?

怎么理解呢?举个极端的例子:比如某某明星爆出一个惊天狠料,海量吃瓜群众同时访问微博去查看该八卦新闻,而微博 Redis 集群中数据在此刻正好过期了,那么无数的请求则直接打到了微博系统的物理 DB 上,DB 瞬间挂了。

解决方案

  1. 热点数据永远不过期

比如我们可以将某个 key 的缓存时间设置为 25 小时,然后后台有个 JOB 每隔 24 小时就去批量刷新一下热点数据。就可以解决这个问题了。

  1. 使用互斥锁

容易影响吞吐量,大部分项目设置热点 key 永不过期就妥妥的了。

三. 缓存雪崩

关键词:Redis 崩了,没有数据了

这里的 Redis 崩了指的并不是 Redis 集群宕机了。而是说在某个时刻 Redis 集群中的热点 key 都失效了。如果集群中的热点 key 在某一时刻同时失效了的话,试想海量的请求都将直接打到 DB 上,DB 可能在瞬间就被打爆了。

解决方案

  1. Redis 失效时间加上随机数

Redis 失效时间加上随机数,是一种比较取巧的解决方案。在一定程度上减轻了 DB 的瞬时压力,但是这种方案也在一定程度上增加了维护的成本。

  1. Redis 永不过期

实现方案在上文中简单提过了。

总结

最后我们再回归到主题!如何轻松的通过联想的方式来区分 Redis 缓存穿透、击穿、雪崩的区别?

  • 缓存穿透—穿过(绕过) Redis 和 DB 来搞你

  • 缓存击穿—定点打击来搞你

  • 缓存雪崩—热点 key 在某一个时刻同时失效

参考资料

https://mp.weixin.qq.com/s/AmxDAhbUpO0awG5mieyAjQ

你可能感兴趣的:(Redis,redis,缓存)