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/
作者
puresai
许可协议