有道无术,术尚可求,有术无道,止于术。
本系列Redis 版本 7.2.5
文章目录
-
- [1. 概述](#1. 概述)
- [2. 常用命令](#2. 常用命令)
-
- [2.1 PFADD](#2.1 PFADD)
- [2.2 PFCOUNT](#2.2 PFCOUNT)
- [2.3 PFMERGE](#2.3 PFMERGE)
- [3. 应用场景](#3. 应用场景)
1. 概述
基数 表示数据集中不重复元素的个数。例如 {1,2,2,3,4,5,5}
中,基数集(不重复的元素)为 {1,2,3,4,5}
,那么该数据集的基数(不重复元素的个数)为5
。
Redis 2.8.9
版本引入了 HyperLogLog
用于基数统计的算法,用于估算一个集合中不同元素的数量(基数),在处理大量数据时具有显著的空间效率优势。
特点:
- 空间效率 :在输入元素的数量或体积非常大时,计算基数所需的空间总是固定的,并且很小。具体来说,每个
HyperLogLog
键只需要花费约12KB
的内存,就可以估算接近2^64
个不同元素的基数。 - 误差 :由于是估算算法,存在一定的误差,标准误差大约是
0.81%
。 - 不存储元素:只会根据输入元素来计算基数,而不会存储输入元素本身,因此不能像集合那样返回输入的各个元素。
2. 常用命令
所有命令:
命名 | 描述 |
---|---|
PFADD | 添加指定元素到 HyperLogLog 中 |
PFCOUNT | 返回给定 HyperLogLog 的基数估算值 |
PFDEBUG | 内部命令,仅用于开发测试 |
PFMERGE | 将多个 HyperLogLog 合并为一个 |
PFSELFTEST | 内部命令,仅用于开发测试 |
2.1 PFADD
PFADD
命令将所有元素参数添加到 HyperLogLog
数据结构中。如果内部储存被修改了, 那么返回 1
, 否则返回 0
。
基本语法:
java
PFADD key element [element ...]
示例:
bash
redis> PFADD hll a b c d e f g
(integer) 1
redis> PFCOUNT hll
(integer) 7
2.2 PFCOUNT
PFCOUNT
用于计算 HyperLogLog
集合的近似基数。
基本语法:
bash
PFCOUNT key [key ...]
注意事项:
- 因为
HyperLogLog
是一个近似数据结构,所以PFCOUNT
返回的结果并不是精确的基数,但它在大多数情况下都足够接近真实值。 PFCOUNT
命令的时间复杂度是O(1)
,无论HyperLogLog
集合的大小如何,执行该命令所需的时间都是恒定的。
示例:
bash
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
2.3 PFMERGE
PFMERGE
命令是用于将多个 sourcekey
合并到一个新的 destkey
中,合并后的 destkey
将包含所有源 sourcekey
的并集的近似基数。
命令语法:
bash
PFMERGE destkey sourcekey [sourcekey ...]
使用示例:
bash
# 使用PFADD命令向两个HyperLogLog键(hll1和hll2)中添加元素。
redis> PFADD hll1 foo bar zap a
(integer) 1
redis> PFADD hll2 a b c foo
(integer) 1
# PFMERGE命令将hll1和hll2合并到新的HyperLogLog键hll3中
redis> PFMERGE hll3 hll1 hll2
OK
# 使用PFCOUNT命令来验证hll3的基数是否等于hll1和hll2的并集的基数
redis> PFCOUNT hll3
(integer) 6
3. 应用场景
常用于需要统计大量数据集合中不同元素数量的场景,如:
UV
统计:统计网站的独立访客数量。PV
统计:统计页面的浏览量DAU/MAU
统计:统计日活跃用户量(DAU
)和月活跃用户量(MAU
),以评估网站或应用的运营情况。
UV
统计,即独立访客(Unique Visitor
)数量的统计,在网站分析和在线业务中是非常重要的指标。需要确保每个访问者的唯一标识是唯一的,以避免重复计数。
示例,添加访问的用户ID
:
bash
localhost:0>PFADD uv:20240624 1 2 3
"1"
localhost:0>PFADD uv:20240624 2 3 5
"1"
统计UV
:
bash
localhost:0>PFCOUNT uv:20240624
"4"