Redis数据结构-布隆过滤器
缓存穿透
什么是缓存穿透
- 黑客不断请求缓存和数据库中不存在的数据
解决方案
- 当通过某一个key查数据时,如果对应的数据库和缓存中都不存在,则在缓存中设置此key为null,并设定一个失效时间。
- 布隆过滤器
- 理解: 长度为n的二进制向量,通过一系列随机映射函数(eg:多个Hash)将数据映射进布隆过滤器中。
- 优点: 存放的不是完整的数据,占用内存很少。新增、查询速度够快。
- 缺点: 随着数据量的增大,误判率会随之增加,只能判断数据一定不存在,不能判断数据一定存在。
- guava实现布隆过滤器:
导入guava依赖测试Demo:1
2
3
4
5<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>19.0</version>
</dependency>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24public class Demo{
private static int size = 1000000;//预计要插入多少数据
private static double fpp = 0.01;//期望的误判率
private static BloomFilter<Integer> bloomFilter = BloomFilter.create(Funnels.integerFunnel(), size, fpp);
public static void main(String[] args) {
//插入数据
for (int i = 0; i < 1000000; i++) {
bloomFilter.put(i);
}
int count = 0;
for (int i = 1000000; i < 2000000; i++) {
//mightContain(i)判断i是否在布隆过滤器中
if (bloomFilter.mightContain(i)) {
count++;
System.out.println(i + "误判了");
}
}
System.out.println("总共的误判数:" + count);
}
}
- 理解: 长度为n的二进制向量,通过一系列随机映射函数(eg:多个Hash)将数据映射进布隆过滤器中。
应用
- 爬虫系统的URL去重
- Hbase、Cassandra、LevelDB、RocksDB内部都有布隆结构
- 邮箱系统的垃圾邮件过滤
refer to https://www.cnblogs.com/zhanggguoqi/p/10571225.html
https://www.cnblogs.com/CodeBear/p/10911177.html
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 yanglau0527@gmail.com
文章标题:Redis数据结构-布隆过滤器
文章字数:421
本文作者:Cynaith
发布时间:2020-05-02, 02:34:35
最后更新:2020-05-02, 02:37:55
原始链接:https://cynaith.github.io/2020/05/02/Redis%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84-%E5%B8%83%E9%9A%86%E8%BF%87%E6%BB%A4%E5%99%A8/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。