PFCOUNT
返回 HyperLogLog 键观察到的集合的近似基数。
语法
PFCOUNT key [key ...]
引入版本:2.8.9
复杂度摘要:O(1)
[!NOTE] 此命令的行为在集群 Redis 环境中有所不同。请参阅 多键操作 页面了解更多信息。
当使用单键调用时,PFCOUNT 返回由存储在指定 key 处的 HyperLogLog 数据结构计算出的近似基数,如果 key 不存在,则返回 0。
当使用多个键调用时,PFCOUNT 返回通过内部将存储在提供的键处的 HyperLogLog 合并到临时 HyperLogLog 中传递的 HyperLogLog 并集的近似基数。
HyperLogLog 数据结构可用于仅使用少量恒定内存来计算集合中的唯一元素,具体而言,每个 HyperLogLog 为 12k 字节(加上键本身的几个字节)。
返回的观察集基数并不精确,而是近似值,标准误差为 0.81%。
例如,要统计一天内执行的所有唯一搜索查询的计数,程序需要在每次处理查询时调用 PFADD。可以随时使用 PFCOUNT 检索估计的唯一查询数。
注意:作为调用此函数的副作用,HyperLogLog 可能会被修改,因为最后 8 个字节对最新计算的基数进行编码以用于缓存目的。所以 PFCOUNT 从技术上来说是一个写命令。
必需参数
key [key ...]
一个或多个HyperLogLog键。对于多个键,该命令返回其并集的近似基数。
示例
redis> PFADD hll foo bar zap
(integer) 1
redis> PFADD hll zap zap zap
(integer) 0
redis> PFADD hll foo bar
(integer) 0
redis> PFCOUNT hll
(integer) 3
redis> PFADD some-other-hll 1 2 3
(integer) 1
redis> PFCOUNT hll some-other-hll
(integer) 6
详细说明
表演
当使用单个键调用 PFCOUNT 时,即使理论上处理密集 HyperLogLog 的恒定时间很长,性能也非常出色。这是可能的,因为 PFCOUNT 使用缓存来记住先前计算的基数,而基数很少发生变化,因为大多数 PFADD 操作不会更新任何寄存器。每秒可以进行数百次操作。
当使用多个键调用 PFCOUNT 时,会执行 HyperLogLogs 的即时合并,速度很慢,而且联合的基数无法缓存,因此当使用多个键 PFCOUNT 时,可能需要毫秒量级的时间,不应滥用。
用户应该记住,该命令的单键和多键执行在语义上是不同的,并且具有不同的性能。
HyperLogLog表示
Redis HyperLogLog 使用双精度表示法:稀疏 表示法适用于对少量元素进行计数的 HLL(导致少量寄存器设置为非零值),而 浓密 表示法适用于较高基数。当需要时,Redis 会自动从稀疏表示切换到稠密表示。
稀疏表示使用经过优化的游程编码来有效地存储大量设置为零的寄存器。密集表示是 12288 字节的 Redis 字符串,以便存储 16384 个 6 位计数器。对双精度表示的需求来自于这样一个事实:使用 12k(这是密集表示内存要求)来编码较小基数的几个寄存器是极其次优的。
两种表示形式均以 16 字节标头为前缀,其中包括一个 magic、一个编码/版本字段以及计算出的缓存基数估计,以小端格式存储(如果估计无效,则最高有效位为 1,因为计算基数后更新了 HyperLogLog)。
The HyperLogLog, being a Redis string, can be retrieved with GET and restored with SET.使用损坏的 HyperLogLog 调用 PFADD、PFCOUNT 或 PFMERGE 命令从来不会出现问题,它可能会返回随机值,但不会影响服务器的稳定性。 Most of the times when corrupting a sparse representation, the server recognizes the corruption and returns an error.
从处理器字大小和字节顺序的角度来看,该表示形式是中性的,因此 32 位和 64 位处理器、大端字节序或小端字节序使用相同的表示形式。
有关Redis HyperLogLog实现的更多详细信息可以在这篇博文中找到。 hyperloglog.c 文件中实现的源代码也易于阅读和理解,并且包含用于稀疏和稠密表示的精确编码的完整规范。
Redis Software 与 Redis Cloud 兼容性
| Redis 软件 |
Redis Cloud |
说明 |
|---|---|---|
| ✅ 标准 |
✅ 标准 |
返回值
RESP2
整数回复:通过 PFADD 观察到的唯一元素的近似数量。
RESP3
整数回复:通过PFADD观察到的唯一元素的近似数量
资料来源:Redis 官方 PFCOUNT 文档;中文内容参考 Redis 文档许可。