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

目录

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. 设置缓存用不失效

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值