简介
去重过滤器,提供常见的去重方案,开发便捷、性能极高。
去重方案
种类 | 去重方案 | 说明 | 特点 | 缺点 | 置出方案 |
---|---|---|---|---|---|
Memory | MemoryFilter | 基于内存集合类型实现 | 准确性高 | 不能持久化 | 随机删除 |
File | FileFiler | 基于文件+集合类型实现 | 准确性高 | 本地内存和存储占用大 | 利用文件指针区间删除 |
Redis | RedisBloomFilter AsyncRedisBloomFilter |
基于Redis Bitmap和布隆过滤器算法实现 | 占用内存极小 | 有误判的情况且不容易删除元素 | 随机删除 |
RedisStringFilter AsyncRedisStringFilter |
基于Redis String数据结构实现 | 不会误判,能基于过期时间实现查询去重和确认机制 | 占用资源很大,需尽可能压缩和设置过期时间 | 设置过期时间 | |
RedisSetFilter AsyncRedisSetFilter |
基于Redis Set数据结构实现 | 准确性高 | 占用资源较大 | 随机删除 | |
RedisSortedSetFilter AsyncRedisSortedSetFilter |
基于Redis SortedSet数据结构实现 | 准确性高 | 占用资源较大 | 根据分值删除 | |
SQL | SQLFilter | 基于SQL关系数据库表主键来实现 | 准确性高 | 在大规模去重场景性能差 | 按时间删除 |
项目特点
- 多种方案提供不同场景需求。
- 基于Lua脚本支持批量操作,速度快。
- 支持异步,可快速集成到异步代码和异步框架中。
代码示例
RedisBloomFilter
import redis
from dupfilter import RedisBloomFilter
server = redis.Redis(host="127.0.0.1", port=6379)
rbf = RedisBloomFilter(server=server, key="bf", block_num=2)
print(rbf.exists_many(["1", "2", "3"]))
rbf.insert_many(["1", "2", "3"])
print(rbf.exists_many(["1", "2", "3"]))
AsyncRedisBloomFilter
import asyncio
import aioredis
from dupfilter import AsyncRedisBloomFilter
async def test():
server = aioredis.from_url('redis://127.0.0.1:6379/0')
arbf = AsyncRedisBloomFilter(server, key='bf')
stats = await arbf.exists_many(["1", "2", "3"])
print(stats)
await arbf.insert_many(["1", "2", "3"])
stats = await arbf.exists_many(["1", "2", "3"])
print(stats)
loop = asyncio.get_event_loop()
loop.run_until_complete(test())
Others
和上述示例类似
后续优化
- 部分去重方案的重置逻辑完善
关于作者
- 邮箱:1194542196@qq.com
- 微信:hu1194542196