使用布隆过滤器解决缓存穿透问题(超详细原理解读)


3楼猫 发布时间:2024-11-26 18:55:18 作者:义眼鼎针找石砖家 Language

CSDN文章链接;https://blog.csdn.net/hrh1234h/article/details/144024554?sharetype=blogdetail&sharerId=144024554&sharerefer=WAP&sharesource=2402_89228704

目录

什么是缓存,缓存有什么作用

什么是缓存穿透问题

布隆过滤器解决缓存穿透问题

什么是布隆过滤器

布隆过滤器解决缓存穿透的思路

使用布隆过滤器(Redisson内集成了Bloom Filter)

引入依赖

配置Redisson客户端

创建布隆过滤器,配置过滤器属性

使用布隆过滤器

布隆过滤器原理深入解读

布隆过滤器的数据结构

手搓布隆过滤器

布隆过滤器的优缺点总结

优点

缺点

——————————————

什么是缓存,缓存有什么作用

缓存通常用于存储经常访问的数据,以便快速检索,减少对原始数据源的直接访问需求。通过存储频繁访问的数据,缓存可以减少对后端数据库或服务的请求,从而减轻它们的负载。

使用布隆过滤器解决缓存穿透问题(超详细原理解读)-第0张

什么是缓存穿透问题

如果查询一个不存在的数据,数据库查询不到数据也不会直接写入缓存,就会导致每次请求都查数据库,相当于缓存失效,如果这种请求很多,尤其是恶意攻击时,会对数据库造成很大的压力,甚至可能导致数据库服务不可用。

使用布隆过滤器解决缓存穿透问题(超详细原理解读)-第1张

布隆过滤器解决缓存穿透问题

什么是布隆过滤器

布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。

布隆过滤器解决缓存穿透的思路

在系统启动或定期更新时,将数据库中已经存在的所有键,这样,布隆过滤器就包含了所有合法的键。请求到达缓存前先在布隆过滤器预检查,如果布隆过滤器判断该键可能不存在,则直接返回请求不存在的结果,不再进行后续的缓存和数据库查询。如果布隆过滤器判断该键可能存在,则继续进行后续操作。

使用布隆过滤器(Redisson内集成了Bloom Filter)

引入依赖

Redisson内集成了布隆过滤器,我们可以直接使用Redisson。

使用布隆过滤器解决缓存穿透问题(超详细原理解读)-第2张

配置Redisson客户端

配置Redisson客户端,连接到Redis服务器。

使用布隆过滤器解决缓存穿透问题(超详细原理解读)-第3张

创建布隆过滤器,配置过滤器属性

使用Redisson创建一个布隆过滤器,并初始化其容量和误判率。

使用布隆过滤器解决缓存穿透问题(超详细原理解读)-第3张

使用布隆过滤器

在查询缓存之前,先使用布隆过滤器检查数据是否存在。如果布隆过滤器返回不存在,则直接返回默认值或错误信息,避免查询数据库。

使用布隆过滤器解决缓存穿透问题(超详细原理解读)-第3张
使用布隆过滤器解决缓存穿透问题(超详细原理解读)-第3张
使用布隆过滤器解决缓存穿透问题(超详细原理解读)-第3张

布隆过滤器原理深入解读

布隆过滤器的数据结构

布隆过滤器(Bloom Filter)的数据结构主要由一个固定长度的位数组(Bit Array)和一组哈希函数(Hash Functions)组成。

使用布隆过滤器解决缓存穿透问题(超详细原理解读)-第3张

存储数据:要存储的数据,通过多个hash函数获取hash值,根据hash计算数组对应位置改为1 。

查询数据:使用相同hash函数获取hash值,判断对应位置是否都为1。

手搓布隆过滤器

直接上代码。

使用布隆过滤器解决缓存穿透问题(超详细原理解读)-第3张
使用布隆过滤器解决缓存穿透问题(超详细原理解读)-第3张
使用布隆过滤器解决缓存穿透问题(超详细原理解读)-第3张
使用布隆过滤器解决缓存穿透问题(超详细原理解读)-第3张

System.out.println("apple: " + bloomFilter.mightContain("apple")); // 应该输出 true

System.out.println("banana: " + bloomFilter.mightContain("banana")); // 应该输出 true

System.out.println("orange: " + bloomFilter.mightContain("orange")); // 应该输出 false

--------------------------

布隆过滤器的优缺点总结

优点

空间效率:布隆过滤器使用位数组存储数据,因此非常节省空间,特别是对于大规模数据集。

时间效率:布隆过滤器的添加和查询操作时间复杂度接近O(1),即常数时间复杂度,非常快速。

简单性:布隆过滤器的实现相对简单,易于理解和实现。

无误漏:布隆过滤器不会错误地报告元素不存在(误漏),即如果一个元素被添加到了布隆过滤器中,那么查询时一定能被检测到。

缺点

误判:布隆过滤器允许误判(false positives),即可能会错误地报告一个元素存在。

不支持删除:标准的布隆过滤器不支持删除操作,因为删除一个元素可能会影响其他元素的测试结果。

固定大小:布隆过滤器一旦创建,其大小和哈希函数数量就固定了,这限制了其灵活性。

内存消耗:虽然布隆过滤器节省空间,但在处理非常大的数据集时,即使是优化过的布隆过滤器也可能消耗大量内存。


© 2022 3楼猫 下载APP 站点地图 广告合作:asmrly666@gmail.com