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
}
}
通过布隆过滤器,可以在一定程度上避免缓存穿透问题,同时控制误判率在可接受范围内。
热门推荐
海外用工须知:员工解雇的法律依据
2025年A股怎么走?谁会是最强主线?
深度学习在计算机视觉中的应用
中国国际邮政编码:简介与应用
多级离心泵的结构图及工作原理(文末附详解视频)
跑步机马拉松训练指南:从基础到进阶的完整攻略
不只变丑,还会影响呼吸功能!两步自测下颌后缩
生肖蛇的最佳配对属相
复古“格纹”这样穿,真的很时髦
潜行于全球城市中的动物居民
识别AI革命机遇:如何应对Deepseek热潮,拥抱未来科技
揭秘清朝大内侍卫的生活,睡前嘴里含块竹片,和皇帝一样的伙食
“吃瓜经济”遭遇平台铁拳:张兰汪小菲被无限期封禁
智能体,与人类共生的新物种?
壁虎进家里怎么处理(教你7招“请”它出去)
电影绑架游戏玩的就是人性
网络专线、光纤专线、数据专线、云专线之间的区别是什么?
如何认识黄金价格的涨跌情况?这种涨跌情况如何反映经济形势?
紧跟理想华为,蔚来的AES有什么特别之处?
杭白菊开花时间(探讨杭白菊生长周期及适宜开花时间)
10 款上头又解压的肉鸽游戏推荐
探秘衡山:五岳独秀间的自然圣境与人文华章
原味松饼的制作方法
如何在个税Web端申请退税
《哪吒2》改写中国影史背后,这些配角燃爆了社交媒体
重磅!多地调整“应届生身份”认定标准
黄仁宇大历史观与《万历十五年》的启示 | 历史学者深度解析
观:抗抑郁药格局现状,析:SSRI、SNRI抑制剂发展趋势
跑步心率高于130怎么办?新手必读的科学指南
什么是实验设计?如何从零开始?