*Redis PFADD 命令
PFADD 将元素添加到 HyperLogLog 数据结构中,用于基数估算。
*语法
PFADD key element [element ...]
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| key | String | 是 | HyperLogLog 键名 |
| element | String | 是 | 要添加的元素,支持多个 |
*返回值
- 1:HyperLogLog 内部被修改(至少有一个新元素被添加)
- 0:内部估计值未发生变化(所有元素已存在)
- 如果 key 不存在,会自动创建空的 HyperLogLog 结构
*时间复杂度
O(1) 每个元素。添加 N 个元素为 O(N)。
*示例
*基本用法
> PFADD hll user1
(integer) 1
> PFADD hll user2 user3
(integer) 1
> PFCOUNT hll
(integer) 3
*重复元素不增加计数
> PFADD hll user1
(integer) 0
> PFCOUNT hll
(integer) 3
*批量添加元素
> PFADD visitors page1 page2 page3 page4 page5
(integer) 1
> PFCOUNT visitors
(integer) 5
*常见错误
| 错误 | 原因 | 解决 |
|---|---|---|
| ERR wrong number of arguments | 未提供 key 或 element | 至少提供 key 和一个 element |
| WRONGTYPE | key 已存在且不是 HyperLogLog | 删除或改用其他 key |
*最佳实践
- 适合大规模 UV 统计、去重计数等允许近似结果的(误差率约 0.81%)场景
- 单个 HyperLogLog 固定使用 12KB 内存,与元素数量无关,极度内存高效
- 不支持删除元素,如需删除需重建整个 HyperLogLog
- 使用 PFMERGE 合并多个 HyperLogLog 实现多维度聚合统计
*FAQ
Q1: PFADD 的计数是精确的吗? A: 不是精确计数。HyperLogLog 是概率算法,标准误差约 0.81%。对于绝大多数统计场景,该精度足够。
Q2: 为什么返回 1 但 PFCOUNT 没有增加? A: 返回 1 表示内部结构被修改,但 HyperLogLog 的计数是概率估算,某些添加可能不影响估算值( especially for small counts)。当计数较小时(< 10),PFADD 可能返回 1 但 PFCOUNT 不变,这是正常行为。
Q3: HyperLogLog 占用多少内存? A: 固定约 12 KB,无论存储多少元素。这是 HyperLogLog 的核心优势——以固定内存实现大规模基数估算。