Categories
Tags
API API文档 CAS CI-CD DevOps Docker ElasticSearch Everything Git GitHub GitHub Actions HTTP客户端 Java JWT Micrometer MyBatis-Plus Prometheus Python Redis RSS Spring Spring Boot Supplier Typora uni-app Vue Web Web应用 Web开发 中间件 代码生成 任务执行 任务管理 会话管理 内存模型 分布式 前端开发 协议 后端开发 图床 字符串匹配 安全认证 容器化 局域网 工具 工具类 并发容器 并发编程 开源 微服务 搜索引擎 数据库 数据科学 数据结构 数据验证 文件处理 文件服务器 日语 正则表达式 死锁 深度学习 源码分析 爬虫 版本控制 监控 算法 线程安全 线程池 缓存 脚本 自动化 自然语言处理 虚拟线程 设计模式 语言学习 部署 锁机制 面试 项目实战 高可用
548 words
3 minutes
布隆过滤器
1. 布隆过滤器
布隆过滤器(Bloom Filter)是一种空间效率极高的概率型数据结构,由位数组和哈希函数两部分组成,用于判断一个元素是否属于一个集合。它由 Burton Howard Bloom 在 1970 年提出,主要用于解决大规模数据下的成员查询问题。其可能产生误判(即判断元素存在时,实际可能不存在),但不会漏判(即判断元素不存在时,实际一定不存在)。
实现原理:
- 初始化:创建一个长度为 m 的位数组,所有位初始化为 0。
- 添加元素:使用 k 个哈希函数将元素映射到位数组的 k 个位置,并将这些位置置为 1。
- 查询元素:使用相同的哈希函数检查元素的 k 个位置是否都为 1。如果都是 1,则元素可能存在;如果有任何一个位置为 0,则元素一定不存在。

使用场景:
- 缓存穿透保护:在缓存系统中,快速判断请求的数据是否可能存在于数据库中。
- 去重:在大规模数据中快速判断某个元素是否已经处理过。
- 推荐系统:过滤已经推荐过的内容。
- 垃圾邮件过滤:快速判断邮件地址是否在黑名单中。
2. 借助Redisson使用布隆过滤器
TIP如果是在Spring Boot项目中引入,可以参考Redisson 介绍
1. 添加 Redisson 依赖
<dependency>
<groupId>org.redisson</groupId>
<artifactId>redisson</artifactId>
<version>3.17.0</version>
</dependency>
2. 初始化 Redisson 客户端
import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;
public class RedissonConfig {
public static RedissonClient createClient() {
Config config = new Config();
config.useSingleServer()
.setAddress("redis://127.0.0.1:6379"); // Redis 服务器地址
return Redisson.create(config);
}
}
3. 使用 Redisson 的布隆过滤器
import org.redisson.api.RBloomFilter;
import org.redisson.api.RedissonClient;
public class BloomFilterExample {
public static void main(String[] args) {
// 初始化 Redisson 客户端
RedissonClient redissonClient = RedissonConfig.createClient();
// 获取或创建布隆过滤器
RBloomFilter<String> bloomFilter = redissonClient.getBloomFilter("myBloomFilter");
// 初始化布隆过滤器
// expectedInsertions: 预计插入的元素数量
// falseProbability: 误判率
bloomFilter.tryInit(10000L, 0.01);
// 添加元素
bloomFilter.add("apple");
bloomFilter.add("banana");
// 检查元素是否存在
System.out.println("Contains 'apple': " + bloomFilter.contains("apple")); // 输出: true
System.out.println("Contains 'orange': " + bloomFilter.contains("orange")); // 输出: false
// 关闭 Redisson 客户端
redissonClient.shutdown();
}
}

