布隆过滤器

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

有概率误判;内存极其省

布隆过滤器 纯数字实例

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

为什么要用多个哈希函数?只用 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();
    }
}
相关推荐
薛定e的猫咪4 分钟前
(ICLR 2026)DF-META:面向 FJSP 的无导数元学习实例自适应调度
人工智能·深度学习·学习·算法·机器学习
Thinker QAQ15 分钟前
并发编程(十一):Shared Memory 与 Message Passing——关系与组合使用
java·python·go·并发编程·shared memory·message passing
齐 飞40 分钟前
idea中git误操作撤回git reset --hard ‘HEAD@{1}‘
java·git·intellij-idea
你的保护色1 小时前
多AS互联BGP4综合实验设计
java
某不知名網友1 小时前
ROS2进阶:服务通信、自定义SRV接口、参数服务器与基于服务的参数通信详解
java·开发语言·microsoft
Wang's Blog1 小时前
Java 项目实战: 交友项目 - MongoDB 入门:体系结构和命令行操作
java·mongodb·交友
小溪学编程1 小时前
将 Bean 放入 Spring 容器中的方式有哪些?
java·后端·spring
java_nnnn1 小时前
LeetCode刷题滑动窗口(水果成篮+找到字符串中所有字母的异位词)Java
java·开发语言·leetcode
用户3721574261352 小时前
Java 读取、修改和清空 PDF 文档属性(元数据)
java
SL_staff2 小时前
从‘改一行代码等三天’到‘改完即生效’:实施工程师的逻辑引擎避坑手记
java·产品·全栈