布隆过滤器

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

有概率误判;内存极其省

布隆过滤器 纯数字实例

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

为什么要用多个哈希函数?只用 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();
    }
}
相关推荐
blxr_4 分钟前
力扣hot100爬楼梯https://leetcode.cn/problems/climbing-stairs/
算法·leetcode·职场和发展
pride.li7 分钟前
ISP标定-NR标定(Noise Reduction,降噪校准)
算法·计算机视觉·isp
我要神龙摆尾19 分钟前
IDEA 阅读插件
java·ide·intellij-idea·idea-plugs·plugs
CQU_JIAKE25 分钟前
9.29【A】
算法·深度优先
没落之王1 小时前
AI在文言文——论文脉复苏对AI的意义
大数据·人工智能·算法
涉密IT资质笔记1 小时前
涉密人员脱密期管理规范:期限分级模型、就业限制边界与违规认定标准
java·服务器·前端·网络·数据库
mmsx1 小时前
Android Dialog 插槽模式:用一套壳统一全应用的弹窗风格
android·java·dialog·开发语言
u0111026751 小时前
工具页案例图如何编写 alt让图片说明与处理场景对应
java·前端·javascript·图像处理·人工智能·算法·ai作画
阿狗童鞋1 小时前
数据结构与算法实战指南
数据结构·算法
码上有光1 小时前
Linux:进程间通信——匿名管道通信、命名管道通信
android·java·linux·linux通信·匿名通信·命名通信