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 或其他缓存系统),以便下次查询时能够快速响应。
热门推荐
阿贾克斯3-0完胜威廉二世,延续不败金身
中医专家推荐:三种中成药治疗有痰咳嗽效果好
下午偏头痛怎么办?这些方法或许能帮到你
勤洗手、多通风、打疫苗:冬季细菌感染预防全攻略
微波炉烤鸡胸肉:懒人也能轻松掌握的健康美味
胫骨结节软骨炎:青少年膝痛的常见原因与防治指南
葡萄牙房地产市场持续向好,预计年涨5%-10%
从苏格拉底到叔本华:西方哲学的生命意义探寻
中医专家详解舌头裂纹:从病因到护理的科学指南
零基础也能玩转手机修图,快来试试吧!
开眼角术后护理指南:休息、清洁、饮食一个都不能少
火车票改签也要收手续费?最新回应来了
高层建筑火灾应急:系统预案制定与实战经验分享
尿蛋白2+竟是肾炎惹的祸?
解密双眼皮手术:对视力的影响与安全指南
均线金叉死叉实战指南:股市投资的技术分析利器
塞来昔布胶囊上市:缓解关节炎疼痛,但这些副作用要注意
新手必看:用SPSS进行二分类逻辑回归分析的详细步骤
暑期自驾/高速/长途6项车辆安全检查!一项也不能少!
从辉煌到衰败:拜占庭帝国的千年兴亡史
从1000元到数万元:电子琴价格影响因素与选购指南
生理性还是病理性?一文读懂“肉跳”真相
从爱情公寓看现代恋爱观:独立才是爱的基石
孩子改姓怎么办?生父同意是关键,还需这些材料
揭秘面相学中的“四高三低”:美学标准还是玄学概念?
满洲里北疆明珠观光塔:208米高空览中俄两国
汉马选手亲测:热敷缓解肌肉酸痛
汉至宋朝禁渔制度演变:中国古代海洋生态保护典范
“应是天仙狂醉”:李白笔下的雪夜世界
斯诺克世界公开赛倒计时,星牌台球闪耀登场