布隆过滤器

布隆过滤器是 由布隆(Burton Bloom)1970 年提出的概率型数据结构,核心用途:快速判断一个元素大概率存在 / 一定不存在,做存在性校验,节省内存、提高查询速度

它是一串很长的01字符串,如果不存在就是0,存在就是1

添加元素流程(以我们的手机号为例子)

1.把手机号依次经过 N 个不同哈希函数计算,得到 N 个不同数组下标位置

2.将这些下标位置的二进制位,全部置为 1

3.比如 3 个哈希函数,就把 3 个 bit 位标记为 1

查询过程也和添加过程类似

1.用同样 N 个哈希函数计算该手机号,得到对应下标

2.只要有任意一个 bit 位是 0 → 该元素一定不存在(绝对准确)

3.所有 bit 位都是 1 → 该元素大概率存在

应用场景

黑名单拦截(IP / 账号 / 违规关键词过滤)

爬虫 URL 去重,避免重复爬网页

商品库存 / ID 存在性快速校验

防止重复消息消费、幂等校验

海量数据检索(亿级数据快速过滤)

布隆过滤器可以使用极小的在大量的数据里面判断一个元素是否存在

Redisson中的布隆过滤器

Redisson 封装了 Redis 原生布隆过滤器(基于 RedisBloom 插件),提供 RBloomFilter 对象,适配分布式微服务,解决跨服务全局查重、防缓存穿透,本质是 Redis 上的位数组布隆过滤器。

java 复制代码
@Autowired
private RedissonClient redissonClient;

// 1. 获取布隆过滤器实例,指定名称、预期容量、误判率
RBloomFilter<String> bloomFilter = redissonClient.getBloomFilter("user_mobile_bloom");
// 初始化(只需要执行一次!重复初始化会重置数据)
// 参数:预期元素总数、允许误判概率
bloomFilter.tryInit(1000000, 0.01);

// 2. 添加元素(手机号)
bloomFilter.add("13800001111");

// 3. 判断元素是否存在
boolean isExist = bloomFilter.contains("13800001111");

// 4. 异步版本
bloomFilter.addAsync("13800002222");
bloomFilter.containsAsync("13800002222");

// 5. 获取布隆信息
long size = bloomFilter.size(); // 已存入元素数量
double falseProbability = bloomFilter.getFalseProbability(); // 当前误判率
相关推荐
敲代码的嘎仔12 分钟前
从零搭建微服务:Spring Cloud Alibaba 全家桶踩坑实录(Nacos + OpenFeign + Gateway + Sentinel)
java·spring boot·spring·spring cloud·微服务·gateway·sentinel
一条泥憨鱼1 小时前
苍穹外卖【day7| 对购物车进行操作】
java·后端·mysql·苍穹外卖
都叫我大帅哥13 小时前
Java JJWT 完全指南:从入门到生产级实践
java
前端开发张小七14 小时前
Java 学习笔记 · 第一课:基础语法与核心概念
java·后端
ThsPool15 小时前
【ENVI二次开发学习整理 04】ENVI功能扩展与二次开发
java·前端·javascript
赤壁小虾15 小时前
【渲染流水线】[逐片元阶段]-[透明度测试]以UnityURP为例
java·前端·数据库
青山木16 小时前
Hot 100 --- 搜索插入位置
java·数据结构·算法·leetcode
Jul1en_16 小时前
【Claude Code Compact】源码级别的学习上下文压缩
java·前端·学习·github·ai编程
摇滚侠16 小时前
《SpringBoot 3:入门与应用实战》第 15 章 生产级特性 管理 Spring Boot 应用 阅读笔记
java·spring boot·笔记
XWalnut16 小时前
SpringBoot快速入门
java·spring boot·后端