Redis 数据类型HyperLogLogs(基数统计)
目录
1 基本特性
2 主要操作命令
2.1 PFADD key element [element ...]
2.2 PFCOUNT key [key ...]
2.3 PFMERGE destkey sourcekey [sourcekey ...]
3 使用场景
HyperLogLog 是 Redis 提供的一种用于基数估计(cardinality estimation)的数据结构。它被设计用来高效地计算一个集合中不重复元素的数量,也就是基数。在处理大规模数据时,直接存储所有元素并计算唯一性可能会消耗大量的内存,而 HyperLogLog 可以使用非常少的内存来估算这个值,并且具有较高的准确性。Redis 的 HyperLogLog 并不是一种独立的数据类型,而是基于字符串(String)数据类型的一种特殊用法。
1 基本特性
- 低内存占用:即使要统计数亿甚至数十亿条记录的基数,HyperLogLog 也只需要大约 12 KB 的内存。
- 固定空间大小:无论你添加多少个元素到 HyperLogLog 中,它所占用的空间都是固定的。
- 可合并性:多个 HyperLogLog 可以合并成一个新的 HyperLogLog,这使得它可以用于分布式环境中的基数估计。
- 概率算法:由于是基于概率的估算,所以结果不是精确的,但通常误差范围可以控制在可接受的范围内(标准误差大约为 0.81%)。
2 主要操作命令
2.1 PFADD key element [element ...]
向 HyperLogLog 添加一个或多个元素,返回值是 1 表示至少有一个元素被添加到 HyperLogLog 中,0 表示没有新元素被添加。
127.0.0.1:6379> pfadd name java
(integer) 1
2.2 PFCOUNT key [key ...]
返回 HyperLogLog 的近似基数。如果提供了多个键,则会先将这些 HyperLogLog 合并再进行计数,如果提供了多个键,那么返回的是这些 HyperLogLog 的并集的基数估计值。
127.0.0.1:6379> pfadd name java
(integer) 1
127.0.0.1:6379> pfadd name c++ go
(integer) 1
127.0.0.1:6379> pfcount name
(integer) 3
127.0.0.1:6379> pfadd name1 python .net
(integer) 1
127.0.0.1:6379> pfcount name name1
(integer) 5
添加重复元素例子:
127.0.0.1:6379> pfadd name java go c++ java python java
(integer) 1
127.0.0.1:6379> pfcount name
(integer) 4
2.3 PFMERGE destkey sourcekey [sourcekey ...]
将一个或多个 HyperLogLog 合并到指定的目的键中,合并后的 HyperLogLog 包含所有源 HyperLogLog 中的元素。
127.0.0.1:6379> pfadd name java go c++
(integer) 1
127.0.0.1:6379> pfadd name1 python .net
(integer) 1
127.0.0.1:6379> pfmerge name2 name name1
OK
127.0.0.1:6379> pfcount name2
(integer) 5
3 使用场景
- 网站独立访客数:统计每天访问网站的不同用户数量。
- 广告点击分析:统计某个广告被不同用户点击的次数。
- 日志分析:统计日志文件中不同 IP 地址的数量。
- 实时数据分析:在流式数据处理中,快速估算唯一值的数量。