布隆过滤器

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

有概率误判;内存极其省

布隆过滤器 纯数字实例

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

为什么要用多个哈希函数?只用 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();
    }
}
相关推荐
一木 之林6 分钟前
七、一-AI 工程实践、插件化调试与软件交付
java·linux·c++
边境悍匪9 分钟前
蜗牛学苑 Java 智能体学习 Day38|Spring AI Alibaba2 思维导图复盘
java·学习·spring
Co_Hui23 分钟前
Java 静态内部类、非静态内部类、匿名内部类的区别?
java
Wang's Blog41 分钟前
Java框架快速入门: Spring Security+OAuth2之自定义认证过滤器实现JSON登录
java·spring·json
计算机编程-吉哥41 分钟前
脑肿瘤MRI智能识别系统:基于深度学习的像素级脑肿瘤语义分割平台【计算机毕业设计选题推荐】
人工智能·python·深度学习·算法·毕业设计·课程设计·大数据毕业设计选题推荐
用户204937554951 小时前
端侧语音部署踩坑:模型能跑不等于终端真的能用
后端·算法
小袁拒绝摆烂1 小时前
一条 SQL 从 30 秒到 300 毫秒:聊聊 MySQL 的 Hash Join
sql·mysql·哈希算法
Wang's Blog1 小时前
Java框架快速入门: Spring Security+OAuth2之密码验证规则与自定义注解
java·数据库·spring
一嘴一个橘子1 小时前
java - redis 缓存击穿 - 互斥锁
java
shehuiyuelaiyuehao1 小时前
算法39,位运算,消失的两个数字
java·数据结构·算法