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
}
}
通过布隆过滤器,可以在一定程度上避免缓存穿透问题,同时控制误判率在可接受范围内。
热门推荐
中国十大观日出圣地:泰山迎日、峨眉金顶、山海关海岸
广州2035文保规划:双文化带引领,活化利用并举
广州2035文化规划:构建系统保护体系,打造四大文化品牌
广州长堤:百年商业地标重焕生机
广州大夫山:华南最大落羽杉林进入最佳观赏期
斐济推十大新玩法,高端度假需求超疫前水平
斐济推十大新玩法,高端游客量已超2019年
斐济情侣度假全攻略:从高空跳伞到海底探险,333座岛屿的浪漫冒险
乐府遗韵:穿越时空的歌与诗
广州火车站将升级“大湾区中心站”,打造“枢纽+”产业体系
广州拟控电动自行车总量,两轮车市增速将放缓
苦茶油:中式烹饪的秘密武器
东方橄榄油的秘密:茶油的健康密码
冠心病患者运动三部曲:科学锻炼降低心血管风险
高血压患者运动指南:有氧、力量、柔韧三类运动详解
心血管病患冬季运动四大注意事项
南瓜子嘌呤含量解析:高吗?怎么吃?
尿酸高了,南瓜子还能“嗑”吗?
南瓜子吃了有什么好处和坏处
I-94入境表格填写2025:美国入境表格怎么填?
中国新生代嘻哈说唱歌手李佳隆到访洛杉矶 走入校园与海外学子谈音乐创作
加拿大取消“边境换签”制度:留学生和移民需调整签证申请计划
6000元以下数码产品享15%购新补贴,专家:惠及中高端市场
2025蛇年春联:传统工艺遇上现代设计
“爆改”的风,吹到了上海七浦路!
金蛇送福:2025年新春海报演绎生肖文化新篇
“爆改”的风,吹到了上海七浦路!
“爆改”的风,吹到了上海七浦路!
“爆改”的风,吹到了上海七浦路!
从首都苏瓦到浪漫丹娜努:斐济四大港口旅游指南