Redis缓存三兄弟

前言

redis在面试中经常被问到,为了有效的帮助笔者自己,以及拥有同样烦恼的朋友们来了解redis常见的知识及面试题。笔者总结了一些关键词,希望大家可以和我一样通过这篇笔记区分并理解各种使用场景吧!
在这里插入图片描述

缓存穿透

关键词:穿过 Redis 和数据库

缓存穿透是指查询一个一定不存在的数据,当 Redis 和数据库中都没有我们想要的数据时,就需要考虑缓存穿透的问题了。查询数据时先去 Redis 中查找某资源,Redis 中查不到就去 DB 中查,DB 中查到后回写一份数据到 Redis 中,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到 DB 去查询,可能导致 DB 挂掉。
在这里插入图片描述
这段逻辑正常情况下问题并不大,但是如果用户恶意重复请求资源 X,该资源在 Redis 和 DB 中都不存在。那么每次请求都会直接打到 DB 上,甚至导致物理 DB 宕机。

解决方案:

1、缓存空结果

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

2、用户合法性校验

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

3、布隆过滤器

在这里插入图片描述

看到这个名词不要慌。简单来说布隆过滤器的用途就是帮助你判断某个值是否存在。布隆过滤器主要是用于检索一个元素是否在一个集合中。我们当时使用的是redisson实现的布隆过滤器。它的底层主要是先去初始化一个比较大数组,里面存放的二进制0或1。在一开始都是0,当一个key来了之后经过3次hash计算,模于数组长度找到数据的下标然后把数组中原来的0改为1,这样的话,三个数组的位置就能标明一个key的存在。查找的过程也是一样的。当然是有缺点的,布隆过滤器有可能会产生一定的误判,我们一般可以设置这个误判率,大概不会超过5%,其实这个误判是必然存在的,要不就得增加数组的长度,其实已经算是很划分了,5%以内的误判率一般的项目也能接受,不至于高并发下压倒数据库。

举个例子来看下:假设我们现在有一个长度为 15 的 bit 数组,该数组的每个位置上只能保存 1 或者 0,1 标识该位置被占用,0 标识该位置未被使用。

对于id1,我们借助三个 Hash 函数分别对其哈希运算。

再将得到的这三个哈希值对 15 求模。

最后将这三个模值落入到 bit 数组上。

id2按照同样的方式再处理一遍。
在这里插入图片描述
如果此时来了一个新的 id3 通过三个Hash算法求出的哈希值为 1、2、3,因为2的占位是0,所以我们则可以断定id3 一定不存在。
布隆过滤器的原理还是比较简单的。这里我们需要注意,布隆过滤器可能存在一定误判的可能性,比如id3其实是不存在的数据,但是通过三个Hash算法求出的哈希值为 3、9、12,因为都存在值则会被误判为存在。但它依然可以帮助你拦截掉大部分一定不存在的数据。
优点:内存占用较少,没有多余key
缺点:实现复杂,存在误判

缓存击穿

关键词:定点打击
缓存击穿的意思是对于设置了过期时间的key,缓存在某个时间点过期的时候,恰好这时间点对这个Key有大量的并发请求过来,这些请求发现缓存过期一般都会从后端 DB 加载数据并回设到缓存,这个时候大并发的请求可能
会瞬间把 DB 压垮。
在这里插入图片描述
试想如果所有请求对着一个 key 照死里搞,这是不是就是一种定点打击呢?
怎么理解呢?举个极端的例子:比如某某明星爆出一个惊天狠料,海量吃瓜群众同时访问微博去查看该八卦新闻,而微博 Redis 集群中数据在此刻正好过期了,那么无数的请求则直接打到了微博系统的物理 DB 上,DB 瞬间挂了。

解决方案:

1、热点数据永远不过期

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

2、使用互斥锁

容易影响吞吐量,大部分项目设置热点 key 永不过期就妥妥的了。
在这里插入图片描述

缓存雪崩

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

缓存雪崩意思是设置缓存时采用了相同的过期时间,导致缓存在某一时刻同时失效,请求全部转发到DB,DB 瞬时压力过重雪崩。与缓存击穿的区别:雪崩是很多key,击穿是某一个key缓存。
在这里插入图片描述
这里的 Redis 崩了指的并不是 Redis 集群宕机了。而是说在某个时刻 Redis 集群中的热点 key 都失效了。如果集群中的热点 key 在某一时刻同时失效了的话,试想海量的请求都将直接打到 DB 上,DB 可能在瞬间就被打爆了。

解决方案:

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

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

2、Redis 永不过期

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

总结

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

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

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

缓存雪崩—热点 key 在某一个时刻同时失效
在这里插入图片描述

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值