布隆过滤器告诉你:不在里面的一定不在;说在里面的不一定真在。
有概率误判;内存极其省
布隆过滤器 纯数字实例



为什么原生布隆过滤器不能删除?

为什么要用多个哈希函数?只用 1 个行不行?



新增数据,是不是要手动加到布隆过滤器?

单项目代码示例
xml
<!-- maven -->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>32.1.3-jre</version>
</dependency>
import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;
public class GuavaBloomDemo {
public static void main(String[] args) {
// 参数1:数据类型;参数2:预估插入元素数量;参数3:期望误判率
BloomFilter<String> bloomFilter = BloomFilter.create(
Funnels.stringFunnel(),
10000, // 预计存1万条数据
0.01 // 期望误判率1%
);
// 添加
bloomFilter.put("user_1001");
bloomFilter.put("user_1002");
// 查询
boolean a = bloomFilter.mightContain("user_1001");
boolean b = bloomFilter.mightContain("user_9999");
System.out.println(a); // true
System.out.println(b); // false
// Guava布隆过滤器:同样不支持删除!
}
}
多项目代码示例
java
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson-spring-boot-starter</artifactId>
<version>3.27.0</version>
</dependency>
import org.redisson.Redisson;
import org.redisson.api.RBloomFilter;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
public class RedisBloomDemo {
public static void main(String[] args) {
// 1. 创建Redisson客户端,连接redis
Config config = new Config();
config.useSingleServer()
.setAddress("redis://127.0.0.1:6379")
.setPassword(null);
RedissonClient redissonClient = Redisson.create(config);
// 2. 获取布隆过滤器对象,key为bloom:goods
RBloomFilter<String> bloomFilter = redissonClient.getBloomFilter("bloom:goods");
// 3. 初始化:预期元素数量10000,期望误判率0.01(1%)
// ✅只需要执行一次!重复调用会报错
bloomFilter.tryInit(10000, 0.01);
// 添加元素
bloomFilter.add("goods_1001");
bloomFilter.add("goods_1002");
// 判断是否可能存在
boolean exist1 = bloomFilter.contains("goods_1001");
boolean exist2 = bloomFilter.contains("goods_9999");
System.out.println(exist1); // true
System.out.println(exist2); // false
redissonClient.shutdown();
}
}