Redis - HyperLogLog
Redis HyperLogLog
Section titled “Redis HyperLogLog”想象一下,你需要统计一个非常受欢迎的网站的独立访客数量。将每个独立的 IP 地址存储在 Redis 集合中会消耗大量的内存。这正是 HyperLogLog 解决的问题。
HyperLogLog 是一种概率型数据结构(Probabilistic Data Structure),用于以极高的内存效率估算集合中独立项的数量(即其“基数”,Cardinality)。它使用每个键大约 12 KB 的内存,无论你是在计数一千个项还是一亿个项,都能提供非常好的近似值。其权衡是固定且很小的标准误差,仅为 0.81%。
何时使用 HyperLogLog 与集合 (Sets)
Section titled “何时使用 HyperLogLog 与集合 (Sets)”- 使用集合的情况: 你需要 100% 的准确性,并且独立项的数量可控(例如,数千或数百万)。内存使用量随项的数量线性增长。
- 使用 HyperLogLog 的情况: 你正在计数大量独立项(例如,数亿或数十亿),并且可以接受一个误差极小的近似值。内存使用量是恒定的且非常小。
示例:统计独立搜索查询
Section titled “示例:统计独立搜索查询”让我们向 HyperLogLog 结构中添加几个搜索查询。请注意,多次添加相同的查询并不会显著改变最终计数。
# 用户 1 搜索 'redis tutorial'> PFADD search:queries "redis tutorial"(integer) 1 # 内部状态发生改变
# 用户 2 搜索 'what is hyperloglog'> PFADD search:queries "what is hyperloglog"(integer) 1
# 用户 3 再次搜索 'redis tutorial'> PFADD search:queries "redis tutorial"(integer) 0 # 内部状态没有改变,因为该元素很可能之前已经被观察到
# 用户 4 搜索 'php redis client'> PFADD search:queries "php redis client"(integer) 1
# 现在,让我们获取独立搜索的估计计数> PFCOUNT search:queries(integer) 3Redis HyperLogLog 命令
Section titled “Redis HyperLogLog 命令”HyperLogLog 的 API 非常简单,仅包含三个命令。
| 命令 | 描述 |
|---|---|
| PFADD key element [element …] | 向 HyperLogLog 中添加一个或多个元素。它实际上不存储元素,而是使用它们的哈希值来更新其内部位图。 |
| PFCOUNT key [key …] | 返回一个或多个 HyperLogLog 的近似基数。如果提供了多个键,它将返回它们并集的估计基数。 |
| PFMERGE destkey sourcekey [sourcekey …] | 将多个 HyperLogLog 结构合并为一个。这对于计算组合的独立计数非常有用,例如,将每日的独立用户计数合并为每周或每月的总数。 |
实际应用:合并每日计数
Section titled “实际应用:合并每日计数”你可以每天追踪独立访客,然后轻松计算每周的独立访客数量,而无需存储整个星期的所有独立 ID。
# 添加周一的访客> PFADD visitors:2023-10-23 user1 user2 user3
# 添加周二的访客> PFADD visitors:2023-10-24 user2 user4 user5
# 这两天总共有多少独立访客?> PFMERGE visitors:week-43 visitors:2023-10-23 visitors:2023-10-24OK
> PFCOUNT visitors:week-43(integer) 5 # 独立用户的数量:user1, user2, user3, user4, user5