目录
目标
列举redis中与HLL(近似基数统计)相关的指令,包括作用、使用时需要注意的地方等。
HLL数据结构
使用小的常量内存空间(12KB,特定编码的特定长度的String),去近似统计集合中唯一元素的数量。
近似值误差0.81%
举例:近似统计唯一的search query
- 每次search query,使用PFADD key searchQuery的URL
- 随时使用PFCOUNT获取唯一query的近似值
统计UV
PFADD
PFADD key [element ...]
O(N) N:参数中ele个数
向HLL数据结构中添加元素,HLL内部可能发生更新,以便表现唯一元素个数的变换
如果key不存在,则新建一个empty HLL;如果HLL内部寄存器发生变化,返回1;否则返回0;
PFCOUNT
PFCOUNT key [key ...]
O(N) N:请求key的数量
获取唯一元素的近似数量
返回
参数是单个key时,如果key存在,返回基数估算值;否则0
参数是多个key,内部将多个HLL merge后,返回基数估算的值
注意
执行该命令后,HLL结构可能发生变化,因为最后8个byte编码存储最近的统计结果,达到cache目的。所以PFCOUNT可以理解为是个写命令。
举例
pfadd hll1 a b c d
"1"
pfcount hll1
"4"
pfadd hll1 a e f
"1"
pfcount hll1
"6"
pfadd hll2 a b c d
"1"
pfcount hll2
"4"
pfcount hll1 hll2 //新进行merge,然后返回
"6"
性能差异
单个KEY时,性能很好。虽然稠密HLL的理论时间较长,但PFCOUNT会使用cache。
多个KEY时,将进行内部merge,而且估算值无法被cache,所以耗时数毫秒。
PFMERGE
PFMERGE destkey sourcekey [sourcekey ...]
O(N) N:HLL的数量
将多个HLL合并存储到另一个HLL,如果目标key不存在,则创建。
返回OK