CSDN文章链接;https://blog.csdn.net/hrh1234h/article/details/144024554?sharetype=blogdetail&sharerId=144024554&sharerefer=WAP&sharesource=2402_89228704
目录
什么是缓存,缓存有什么作用
什么是缓存穿透问题
布隆过滤器解决缓存穿透问题
什么是布隆过滤器
布隆过滤器解决缓存穿透的思路
使用布隆过滤器(Redisson内集成了Bloom Filter)
引入依赖
配置Redisson客户端
创建布隆过滤器,配置过滤器属性
使用布隆过滤器
布隆过滤器原理深入解读
布隆过滤器的数据结构
手搓布隆过滤器
布隆过滤器的优缺点总结
优点
缺点
——————————————
什么是缓存,缓存有什么作用
缓存通常用于存储经常访问的数据,以便快速检索,减少对原始数据源的直接访问需求。通过存储频繁访问的数据,缓存可以减少对后端数据库或服务的请求,从而减轻它们的负载。
什么是缓存穿透问题
如果查询一个不存在的数据,数据库查询不到数据也不会直接写入缓存,就会导致每次请求都查数据库,相当于缓存失效,如果这种请求很多,尤其是恶意攻击时,会对数据库造成很大的压力,甚至可能导致数据库服务不可用。
布隆过滤器解决缓存穿透问题
什么是布隆过滤器
布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。
布隆过滤器解决缓存穿透的思路
在系统启动或定期更新时,将数据库中已经存在的所有键,这样,布隆过滤器就包含了所有合法的键。请求到达缓存前先在布隆过滤器预检查,如果布隆过滤器判断该键可能不存在,则直接返回请求不存在的结果,不再进行后续的缓存和数据库查询。如果布隆过滤器判断该键可能存在,则继续进行后续操作。
使用布隆过滤器(Redisson内集成了Bloom Filter)
引入依赖
Redisson内集成了布隆过滤器,我们可以直接使用Redisson。
配置Redisson客户端
配置Redisson客户端,连接到Redis服务器。
创建布隆过滤器,配置过滤器属性
使用Redisson创建一个布隆过滤器,并初始化其容量和误判率。
使用布隆过滤器
在查询缓存之前,先使用布隆过滤器检查数据是否存在。如果布隆过滤器返回不存在,则直接返回默认值或错误信息,避免查询数据库。
布隆过滤器原理深入解读
布隆过滤器的数据结构
布隆过滤器(Bloom Filter)的数据结构主要由一个固定长度的位数组(Bit Array)和一组哈希函数(Hash Functions)组成。
存储数据:要存储的数据,通过多个hash函数获取hash值,根据hash计算数组对应位置改为1 。
查询数据:使用相同hash函数获取hash值,判断对应位置是否都为1。
手搓布隆过滤器
直接上代码。
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),即可能会错误地报告一个元素存在。
不支持删除:标准的布隆过滤器不支持删除操作,因为删除一个元素可能会影响其他元素的测试结果。
固定大小:布隆过滤器一旦创建,其大小和哈希函数数量就固定了,这限制了其灵活性。
内存消耗:虽然布隆过滤器节省空间,但在处理非常大的数据集时,即使是优化过的布隆过滤器也可能消耗大量内存。