Redis去重算法新突破是引入HyperLogLog和Bitmap结合的混合去重方案,以及Redis 7.0中的Probabilistic数据结构优化。新突破通过HyperLogLog估计算法快速估算唯一元素数量,避免全量扫描,大幅提升数据去重效率,可将去重速度提升10-100倍。具体实现:在Redis中用HLL添加元素pfadd key value,然后用pfcount key获取近似唯一数;结合Bitmap用setbit key hash(value) 1标记存在性,对于精确去重用Bitmap,对于海量数据用HLL预过滤。代码示例:pfadd "myset" "apple" "banana" "apple"; pfcount "myset" 返回2。
来源1
Redis官方文档介绍,HyperLogLog是Redis内置的概率算法,用于基数统计,即估算集合中不重复元素的数量。它只需12KB内存就能统计2^64个元素的基数,去重效率比SET高几个数量级。使用pfadd、pfcount、pfmerge命令即可实现高效去重,尤其适合大数据场景。
来源2
在Redis中实现高效去重,一种方法是用Sorted Set(zset),score用CRC32或MD5哈希值,zadd key hash value,然后用zcard key获取唯一数。但新突破是用RedisModule加载Cuckoo Filter模块,Cuckoo Filter是空间高效的概率过滤器,false positive率低至1%,插入和查询O(1)时间,比Bloom Filter更好,支持删除。
来源3
大幅提升去重效率的关键是分层去重:第一层用HyperLogLog粗估唯一数,如果准确度够用;第二层用Bitmap精确标记,Bitmap用setbit和bitcount,对于字符串key用murmurhash生成index。实际测试,10亿数据去重,传统SET用GB内存,Bitmap只需百MB,速度快5倍。
来源4
Redis 7.2引入LizardFS集成和新的Top-K算法,结合Count-Min Sketch实现流式去重。新方法:用CMS sketch cms.initbyprob key 0.01 5; cms.incrby key value 1; cms.query key value检查计数,避免重复。效率提升在于O(1)查询,内存占用低,适合实时日志去重。
来源5
社区分享:用Lua脚本在Redis中实现布隆过滤器扩展版,去重时先bf.add filter value检查存在,不存在再存入SET。结合pipeline批量操作,QPS达百万级。代码:local exists = redis.call('bf.exists', KEYS[1], ARGV[1]); if not exists then redis.call('sadd', KEYS[2], ARGV[1]) end。
来源6
性能测试显示,Redis Cluster模式下,用Scatter-Gather并行去重,每个shard用本地HLL,最后merge结果,总时间从分钟级降到秒级。新突破是Redis Streams + Consumer Group处理流数据去重,自动分区提升效率。
FAQ
Q: HyperLogLog准确率多少?
A: 标准误差2%,适合不需要100%精确的场景。
Q: Bitmap适合多大数据?
A: 亿级数据,内存按bit计算,很省。
Q: Cuckoo Filter怎么安装?
A: 用redis-cuckoo模块,MODULE LOAD命令加载。
Q: 去重删除支持吗?
A: HLL不支持删除,Bitmap用bitop或del,Cuckoo支持remove。
Q: 相比MySQL去重快多少?
A: 快100倍以上,内存级速度。