Redis hyperloglog误判
HyperLogLog 是 Redis 的一种数据类型。在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。HyperLogLog 的典型应用场景就是计算 uv。
但是 HyperLogLog 是存在误判的,官方介绍其标准误差为0.81%,所以如果你想精确的统计 uv,仅仅使用 HyperLogLog 是不够的。
我们不妨测试下:
import Redis
import hashlib
def md5(text: str):
return hashlib.md5(text.encode()).hexdigest()
Redis_conn = Redis.Redis(host="localhost", port=6379, db=0)
Redis_conn.auth("123456")
for i in range(1000):
if Redis_conn.pfadd("hyperloglog-test", md5(str(i))) == 0:
print(i)
输出如下:
➜ user-sai git:(main) ✗ python3 codesnippets/python/hyperloglog.py
193
294
406
527
579
588
616
688
706
764
770
846
872
876
880
888
941
975
984
991
可以看到是有一些误判的。
因而,如果需要很精确地做类似去重计数任务, HyperLogLog 并不是一个好的方案,即便 HyperLogLog 又快又节省内存。
参考:
Redis hyperloglog误判
https://blog.puresai.com/2023/02/05/472/