布隆过滤器

布隆过滤器告诉你:不在里面的一定不在;说在里面的不一定真在。

有概率误判;内存极其省

布隆过滤器 纯数字实例

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

为什么要用多个哈希函数?只用 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();
    }
}
相关推荐
Pocker_Spades_A1 小时前
飞算JavaAI 48分钟能做完Java全栈项目吗?
java·springboot·#ai编程·#飞算javaai·#java代码生成·#aicoding模型·#java开发
徒慕风流1 小时前
激光雷达回波信号滤波与时刻鉴别算法:原理、代码实现与仿真验证
python·算法·激光雷达
这料鬼有毒1 小时前
二刷hot100-70.爬楼梯
算法
步行cgn1 小时前
MyBatis 一对多关联映射详解
java·后端
用户3126874877202 小时前
线程池到底怎么调?从源码看懂 ThreadPoolExecutor 的 7 个参数
java
SQL-First布道者2 小时前
持久层框架的评价标准:只有一个
java·spring boot·spring·tomcat·mybatis·spring jdbc
孔明click332 小时前
Sa-Token v1.46.0 发布 🚀,来看看有没有令你心动的功能!
java·sa-token·开源·springboot·权限认证
m0_587383002 小时前
智慧场馆解决方案实战指南:从系统架构到落地部署全解析
java·spring boot·架构·系统架构
ZC跨境爬虫2 小时前
LeetCode 13. 罗马数字转整数(多解法详解 + Java Python 实现)
java·python·leetcode