Redis缓存穿透问题及布隆过滤器解决方案
创作时间:
作者:
@小白创作中心
Redis缓存穿透问题及布隆过滤器解决方案
引用
CSDN
1.
https://blog.csdn.net/qq_43620216/article/details/140337163
什么是缓存穿透
缓存穿透是指查询一个不存在的数据,由于MySQL查询不到的数据也不会直接写入缓存,导致每次请求都直接访问数据库。正常情况下,如果数据存在,系统会先从缓存中获取数据,如果缓存中没有,则从数据库中获取并存入缓存。但当查询的数据不存在时,每次请求都会直接访问数据库,造成缓存穿透。
解决方案
方案一:缓存空数据
将不存在的数据也缓存到Redis中,即缓存空数据。
优点:实现简单。
缺点:会消耗额外的内存空间。如果该数据后续有了实际值,从缓存中取到的还是空数据,会发生数据不一致问题。
方案二:布隆过滤器
布隆过滤器是一种空间效率极高的概率数据结构,用于判断一个元素是否在一个集合中。其特点是:
- 可以判断一个元素是否可能在集合中
- 不会误判不存在的元素
- 会误判存在的元素(即存在一定的误判率)
布隆过滤器算法原理:
- 将数据id通过hash函数计算多次,得到多个位数。
- 将这些位数在位数组中标记为1。
- 当需要判断一个id是否存在时,同样通过hash函数计算多次,检查对应位是否都为1。如果都为1,则认为该id可能存在;如果有一个位为0,则可以确定该id不存在。
缺点:存在误判率。如下图所示,id3的数据实际上不存在,但由于反hash后的值正好对应id1和id2的某几位数值,导致布隆过滤器认为id3存在。
解决方案:可以通过扩大位数组的大小来减少误判率,但这会增加内存消耗。
布隆过滤器Java实现示例
以下是使用Google Guava库实现布隆过滤器的示例代码:
import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;
public class BloomFilterExample {
public static void main(String[] args) {
int size = 1000; // 设置布隆过滤器的大小
double fpp = 0.05; // 设置误判率
// 初始化布隆过滤器
BloomFilter<String> bloomFilter = BloomFilter.create(Funnels.unencodedCharsFunnel(), size, fpp);
// 添加元素
bloomFilter.put("hello");
bloomFilter.put("world");
// 测试元素是否存在
System.out.println(bloomFilter.mightContain("hello")); // true
System.out.println(bloomFilter.mightContain("world")); // true
System.out.println(bloomFilter.mightContain("unknown")); // false
}
}
通过布隆过滤器,可以在一定程度上避免缓存穿透问题,同时控制误判率在可接受范围内。
热门推荐
榆林中院发布2024年度交叉执行案件典型案例
鼻腔里老有浓鼻涕怎么办
2025年稀土行业分析:稀土政策引领精细化治理新阶段
甘肃大学生养牛创业项目:创新农业助力乡村振兴
在职考研:究竟是成长的阶梯,还是“内卷”的漩涡?
长租好还是短租好?——如何选择最适合的租赁方式
CMC:生物制药领域的质量守护者
人身意外险理赔流程及注意事项
国际货运代理分享3类危险品丙二醇甲醚包装运输事项及海运订舱资料
香港房屋租赁签约完全指南:从租约到大厦公契
先进材料打造的轻薄夜视镜片可以让所有人都能在黑暗中看到东西
如何处理车辆出现轻微划痕的情况?这种处理方式有哪些实际效果?
快速水分测定仪:提升行业效率的科技力量
60-80岁没有驾照的老年人,4种出行方案来了!不查不扣不罚
北斗定位系统的应用与未来发展:前景分析
贵州荔波交通大发展:构建立体网络,升级服务品质,探索智慧出行
中国最东、最南、最西、最北的4座城市,你都知道是哪吗?
中国最东、最西、最南、最北的四座城市,分别在哪里?你去过吗?
心学问心理教育,创造力的释放:青春期的创新思维与艺术表达
副业项目日常管理制度怎么写
咖啡因的功效和作用
英国一学期多少天
车险漏保后应如何处理?怎样避免车险漏保情况发生?
太原周边游都有哪些景点推荐
气胸如何预防
烫头前的护理措施
模拟量信号如何采集
大数据治理入门:数据共享与交换实现高效协作
年度时间进度公式:如何高效管理你的一年?
肺癌哪里能治好