【Redis】缓存穿透

本文讨论了当客户端请求的数据在缓存和数据库中都不存在时,如何通过在Redis中缓存空对象和使用布隆过滤器来减轻数据库压力。前者虽然简单但可能导致内存消耗和短期不一致;后者利用哈希算法和二进制向量实现快速查询,减少不必要的数据库访问。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题发生背景:客户端请求的数据再缓存中和数据库中都不存在。
导致的问题:缓存永远不会生效,这些请求都会去请求数据库—导致数据库压力增大。
解决方案:
1.缓存空对象
在Redis中缓存空对象,告诉客户端数据库中没有该值。 该方法得设置一个短时间的TTL。
优点:实现简单,维护方便
缺点:会有额外的内存消耗,可能造成短期的不一致。 —数据库更新的时候,缓存还没变。
在这里插入图片描述
2.布隆过滤:
在这里插入图片描述
总体思路如上图所示,就是在客户端取数据的时候先访问布隆过滤器,得到数据库是否包含该数据的结果,有再访问没有就不访问。
布隆过滤器原理:
其实这就是一个哈希算法,哈希查询算法,
哈希算法是借助哈希表查找目标元素的方法,其中用的是哈希函数。
key = f(value)。f()是哈希函数,得到的结果是目标元素的key。
而在布隆过滤器这里,我们不需要知道目标元素的key,我们只需要知道这个元素存不存在,所以,我们的散列函数里面存储的就是0和1,0表示不存在,1表示存在。
而布隆过滤器的实现:

  1. 建立一个二进制向量,将所有位设置为0.
  2. 选定k个散列函数,用于对元素进行k次散列,计算向量的位下标。
  3. 添加元素,每添加一个就用k个散列函数分别作用于元素,生成对应下标,并将对应的值设为1.
  4. 检查元素,检查一遍是否都是1。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值