Redis中使用布隆过滤器解决缓存穿透问题
创作时间:
作者:
@小白创作中心
Redis中使用布隆过滤器解决缓存穿透问题
引用
CSDN
1.
https://blog.csdn.net/yuanmomoya/article/details/142022935
缓存穿透(失效)问题
缓存穿透是指查询一个一定不存在的数据,由于缓存中没有命中,会去数据库中查询,而数据库中也没有该数据,并且每次查询都不会命中缓存,从而每次请求都直接打到了数据库上,这会给数据库带来巨大压力。
布隆过滤器原理
布隆过滤器(Bloom Filter)是一种空间效率很高的随机数据结构,它利用多个不同的哈希函数将一个元素映射到一个位数组中的多个位置,并将这些位置的值置为 1。
当查询一个元素时,同样使用这些哈希函数计算出多个位置,如果这些位置上的值都为 1,那么这个元素可能存在;如果有任何一个位置上的值为 0,那么这个元素一定不存在。
布隆过滤器存在一定的误判概率,即可能会把不存在的元素判断为存在,但不会把存在的元素判断为不存在。
使用 Redis 中的布隆过滤器解决缓存穿透问题的代码
引入依赖
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.21.1</version>
</dependency>
代码实现
import org.redisson.Redisson;
import org.redisson.api.RBloomFilter;
import org.redisson.api.RedissonClient;
public class BloomFilterCache {
private final RedissonClient redissonClient;
private final RBloomFilter<String> bloomFilter;
public BloomFilterCache() {
redissonClient = Redisson.create();
// 创建布隆过滤器,预计插入 10000 个元素,误判率为 0.01
bloomFilter = redissonClient.getBloomFilter("myBloomFilter");
bloomFilter.tryInit(10000, 0.01);
}
public boolean mightContain(String key) {
return bloomFilter.contains(key);
}
public void add(String key) {
bloomFilter.add(key);
}
public void close() {
redissonClient.shutdown();
}
public static void main(String[] args) {
BloomFilterCache bloomFilterCache = new BloomFilterCache();
// 添加一些可能存在的键
bloomFilterCache.add("key1");
bloomFilterCache.add("key2");
// 查询键是否可能存在
System.out.println(bloomFilterCache.mightContain("key1")); // true
System.out.println(bloomFilterCache.mightContain("key3")); // false
bloomFilterCache.close();
}
}
在上述代码中,首先创建了一个 Redisson 客户端,并初始化了一个布隆过滤器。mightContain
方法用于判断一个键是否可能存在于布隆过滤器中,add
方法用于向布隆过滤器中添加一个键。
使用布隆过滤器可以在缓存之前进行快速判断,减少对数据库的不必要查询,从而有效地解决缓存穿透问题。
缓存失效后的处理策略
- 返回异常信息,业务流程往下走
- 记录对应的日志信息
- 异步缓存key到redis
具体步骤如下:
- 当使用布隆过滤器判断某个 key 不存在时,触发一个异步任务。
- 异步任务从可能的数据来源(如数据库、外部 API 等)获取该 key 对应的数据。
- 如果获取到数据,将其存入缓存(Redis 或其他缓存系统),以便下次查询时能够快速响应。
热门推荐
喝多了怎么办?保持冷静和健康应对的实用指南
上海GDP超5万亿意味着什么?与全球顶级城市还有哪些差距?
探索经典成语故事:它们背后的历史与寓意
十二生肖时辰对照表解析:原理与应用指南
辣椒面和辣椒粉一样吗?辣椒面的做法及吃法分享
轻伤怎么判级别?赔偿标准与判刑有何不同?
模拟打哈欠,放松颈部肌肉
用10个帮买案例告诉你,买便宜的二手代步车需要注意哪些问题?
渔帆暗涌结局有哪些 渔帆暗涌游戏结局分享
房贷利息怎么算出来的?一起来看看!
黄金比例在游戏设计中的应用
配音师分享:如何提升小说推文的吸引力
米诺地尔酊生发液哪种效果好?液体好还是凝胶泡沫好
AI定式小百科:走小目开局对手直接碰怎么办
世界各国向校园欺凌说“不”
怎样去下巴的闭口粉刺
中医体质辨识:你属于哪种体质?如何针对性进行养生调理?
从规则争议看中韩围棋如何共竞发展
银行的基金投资风险分散的多元化策略与实践?
41种法定传染病都有哪些?怎么分类?潜伏期是多久?
心理退行现象:恋爱中的伴侣往往更加幼稚和孩子气!
“经典条件反射:巴甫洛夫的狗实验与学习原理”
屏蔽力,是成年人最顶级的能力
住房公积金提取用途及方法有哪些
哪些因素影响教师的薪资待遇?
小孩睡觉打呼噜是什么原因引起的
汽车电池没电怎么办?三种实用应急启动方法
房屋产权办理指南:流程、年限及房改房详解
"七天无理由退货"被拒,只因忽视了这关键一步
72胜+总决赛耸肩杀!乔丹如何用绝对霸权碾压所有挑战者?