一文彻底了解redis缓存穿透、雪崩,解决策略和布隆过滤器

  • Post author:
  • Post category:其他



目录


1、什么是缓存穿透


2、缓存穿透解决方法


2.1、参数校验


2.2、缓存无效key


2.3、布隆过滤器


3、缓存雪崩


4、缓存雪崩解决策略


4.1、对于redis服务不可用的情况:


4.2、对于热点缓存失效问题:


1、什么是缓存穿透

就是大量的访问数据的请求的key不存在redis中,导致这些请求直接打到数据库上,根本没经过缓存这一层。比方说:有人制造了缓存中不存在的key发送了大量的请求,导致大量的请求落到了数据库上面,可能会造成数据库崩溃。

2、缓存穿透解决方法


2.1、参数校验

最基本的操作,不合法的参数请求直接返回给数据库。比如查询的数据库 id 不能小于 0、传入的邮箱格式不对的时候直接返回错误消息给客户端等等。


2.2、缓存无效key

如果缓存和数据库中都查不到某个key就将key写到一个redis并设置过期时间。这种方法可以解决key变化不频繁的情况。


2.3、布隆过滤器

布隆过滤器就是我们将所有可能存在的请求,放到布隆过滤器中。当用户发送请求时先判断请求的值是否存在于布隆过滤器中。不存在的话就给前端返回参数错误告诉前端,存在的话才能继续走下面的逻辑。

但是,需要注意的是布隆过滤器可能会存在误判的情况。总结来说就是:

布隆过滤器说某个元素存在,小概率会误判。布隆过滤器说某个元素不在,那么这个元素一定不在。


布隆过滤器原理:

当一个元素加入到布隆过滤器的时候,会进行这些操作:

1、使用布隆过滤器中的哈希函数对元素值进行计算,得到hash值(有几个hash函数就得到几个hash值)

2、根据得到的hash值,在位数组中把对用的下标设为1。


当我们需要判断一个元素是否存在于布隆过滤器的时候,会进行这些操作:

1、对给定的元素再次进行相同的hash运算。

得到值后判断位数组中的每个元素是否都是1,如果都是1,说明这个值在布隆过滤器中,如果存在一个值不为1,说明不在布隆过滤器中。

然后,一定会出现这样一种情况:

不同的字符串可能哈希出来的位置相同。

(可以适当增加位数组大小或者调整我们的哈希函数来降低概率)

3、缓存雪崩

缓存或者热点缓存在同一时间大面积失效,后面的请求都落到了数据库上,造成数据库短时间内承受了大量的请求。


举个例子:

有一个秒杀活动,在12点开始,我们在缓存中放了一批商品,设置缓存过期时间为12点。那么秒杀开始的时候,缓存就失效了,所有的请求直接落到了数据库上。

4、缓存雪崩解决策略


4.1、对于redis服务不可用的情况

  1. 采用redis集群,避免单机出现问题整个缓存服务都没办法使用

  2. 限流,避免同时处理大量的请求


4.2、对于热点缓存失效问题

  1. 设置不同的失效时间,比如随机设置缓存失效时间,这样就不会造成大面积热点缓存同时失效。

  2. 设置缓存用不失效



版权声明:本文为m0_57659908原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。