布隆过滤器&HyperLogLog

布隆过滤器和HyperLogLog(HLL)都是为了解决大数据集的存储和查询问题。前者用于判断元素可能存在,允许一定误判率,后者专注于高效计数,牺牲精确度。由于它们的设计原理不同,布隆过滤器不适合进行计数,而HLL无法确定元素具体存在。这两种技术在存储和计算资源有限的场景下,提供了有效的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简单理解。目标都是节省存储空间,结果都是非精准,都有一定的设置误判率或误差率的能力。布隆过滤器核心在于判定是元素是否存在,HLL核心是计数。所以反过来讲,由于地层逻辑的区别,布隆过滤器不能做计数,HLL不能判定元素是否存在。

### 使用 Redis 实现布隆过滤器 Redis 提供了多种数据结构来支持高效的集合操作,其中 HyperLogLog 和 Bitmaps 可用于近似算法的实现。然而,对于更复杂的布隆过滤器功能,则通常依赖于第三方库或模块。 #### 方法一:通过 `redis-py` 库配合 Python 的 Bloom Filter 库 可以利用 Python 中的 `pybloomfiltermmap3` 来创建本地布隆过滤器实例,并将其状态保存到 Redis 中以便分布式应用共享[^1]: ```python import redis from pybloomfilter import BloomFilter r = redis.Redis(host='localhost', port=6379, db=0) bf_key = 'my_bf' if not r.exists(bf_key): # 如果不存在则初始化一个新的布隆过滤器并存储至Redis bf = BloomFilter(1000000, 0.01, bf_key) else: bf = BloomFilter.open_from_redis(redis_conn=r, key=bf_key) # 添加元素 item_to_add = "example_item" bf.add(item_to_add.encode()) # 查询是否存在某项 print(f"Does '{item_to_add}' exist? {item_to_add.encode() in bf}") ``` 此方法允许应用程序之间共享相同的布隆过滤器配置而无需重复构建。 #### 方法二:使用 RediSearch 或其他扩展模块 某些情况下可以直接采用专门设计用来增强 Redis 功能性的插件,比如 RediSearch 模块提供了内置的支持来进行模糊匹配查询以及布隆过滤器的操作[^2]: 安装 RediSearch 后可以通过命令行工具 `redis-cli` 执行如下指令完成基本设置: ```bash FT.CREATE idx SCHEMA title TEXT WEIGHT 5.0 body TEXT BF.RESERVE myBloomFilter 0.01 1000 EXPANSION 4 ``` 上述代码片段展示了如何定义全文索引和预留一个名为 `myBloomFilter` 的布隆过滤器资源,设定误报率为 0.01%,初始容量为 1000 并指定了增长因子为 4。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值