redis缓存穿透及解决方案

缓存访问的过程如下:

(1)应用访问缓存,假如数据存在,则直接返回数据
在这里插入图片描述
(2)数据在redis不存在,则去访问数据库,数据库查询到了直接返回应用,同时把结果写回redis
在这里插入图片描述
(3)数据在redis不存在,数据库也不存在,返回空,一般来说空值是不会写入redis的,如果反复请求同一条数据,那么则会发生缓存穿透。
在这里插入图片描述
当然解决方案是可以为这个key设置一个空值,同时写入redis,下次请求的时候就不会访问数据库,但是如果每次请求的是不同的key,同时这个key在数据库中也是不存在的,那这样依然会发生缓存穿透。

布隆过滤器
我们可以这样考虑,可以先判断key值是否存在,如果不存在,则不访问redis,那这样就可以拦截大量的请求,布隆过滤器恰好可以实现这样的需求。
布隆过滤器本质是一个二进制向量,初始化的时候每一个位置都是0,如下图,比如说a经过hash算法后得到一个下标位置,接下来就会把下标的值改为1,图中所示的是没一个元素经过三次hash运算,每一个红线代表一次hash算法,为什么要运算三次呢,这是为了减少hash冲突,当然hash算法不一定是三次,经过多次不同维度的哈市算法后,就把a值映射到了二进制向量里面,这样的好处很多,可以节省空间,假如说a值是一串很长的字符串,那么经过映射后就可以只占三位长度,并且查找速度很快。
在这里插入图片描述
如果布隆过滤器判断元素存在,则不一定存在,如果不存在,则一定不存在
如何理解这句话,因为有可能你一个元素运算得到的下标恰好是别的元素的下标,如果经过运算后布隆过滤器判断不存在,也就是说至少有一个下标是为0的,那肯定是不存在的

布隆过滤器的使用
用Google的guava包已经有了布隆过滤器算法的实现,注意的是布隆过滤器有一定的误判率,不可能达到100%的精准,首先初始化项目的时候从数据库查询出来所有的key值,然后放到布隆过滤器中,guava包都实现了相应的put方法和hash算法。

加了布隆过滤器的过程如下
在这里插入图片描述
1,当应用访问的时候,先去布隆过滤器中判断kedy值,如果发觉没有key值不存在,直接返回
2、如果key值在布隆过滤器存在,则去访问redis,由于是有误判率的,所以redis也有可能不存在
3、那么这时候就去访问数据库,数据库不存在,那就直接返回空就行

如果误判率为3%,当有100万个请求同时过来的时候,布隆过滤器已经挡住了97万个请求,剩下3万个请求假如是误判的,这时候再访问数据库可以通过加锁的方式实现,只有竞争到锁了就去访问数据库,这样就完全可以解决缓存穿透问题

布隆过滤器的应用
比如说输入用户名的时候,可以马上检测出该用户名是否存在,黑名单机制,单词错误检测等

  • 7
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
对于 Redis 缓存的穿透、击穿和雪崩问题,可以采取以下解决方案: 1. 缓存穿透:当请求的数据在缓存中不存在时,会直接访问数据库,如果有恶意攻击者大量请求不存在的数据,会给数据库造成很大压力。解决方案可以是在查询前进行参数校验,比如对请求的参数进行合法性检查,或者使用布隆过滤器等技术来快速判断请求的数据是否存在。 2. 缓存击穿:当某个热点数据过期或被删除时,大量请求同时涌入,导致请求直接访问数据库。为了解决这个问题,可以使用互斥锁(Mutex)或者分布式锁来避免多个请求同时访问数据库。在获取锁之前,首先尝试从缓存获取数据,如果缓存中存在,则直接返回;如果不存在,则获取锁,并从数据库中获取数据并放入缓存,最后释放锁。 3. 缓存雪崩:当缓存中的大量数据同时过期时,会导致大量请求直接访问数据库,给数据库带来巨大压力。为了解决这个问题,可以采取以下措施: - 设置合理的缓存过期时间,使得不同数据的过期时间错开,避免同时失效。 - 使用热点数据预加载,提前将热点数据加载到缓存中,避免同时失效。 - 使用多级缓存架构,将缓存分为多个层级,不同层级的缓存设置不同的过期时间,从而降低缓存失效的风险。 - 引入限流和熔断机制,对请求进行限制,避免大量请求同时访问数据库。 通过以上措施,可以有效地解决 Redis 缓存穿透、击穿和雪崩问题

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值