欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Redis学习手册6—数据结构之HyperLogLog

程序员文章站 2022-07-11 14:51:56
...

HyperLogLog简介

HyperLogLog是一个专门计算集合的基数而创建的概率算法,对于一个给定的集合,HyperLogLog可以计算出这个集合的近似基数:近似基数并非集合的实际基数,它可能会比实际的基数小一点或大一点,但是估算的基数和实际基数之间的误差会处于一个合理的范围内,因此那些不需要知道实际基数或者因为条件限制而无法计算出实际基数的程序就可以把这个近似基数当做集合的实际基数使用。

HyperLogLog的优点

HyperLogLog的优点在于它计算近似基数所需的内存并不会因为集合的大小而改变,无论集合包含的元素有多少个,HyperLogLog进行计算所需的内存总是固定的,并且非常少的。

Redis的HyperLogLog只需要使用12kb的内存空间,就可以对接近:2642^{64}个元素进行基数,而算法的标准误差仅为0.81%,因此它计算出的近似基数是相当可信的。

HyperLogLog命令速查表

命令 用法及参数 说明
PFADD PFADD hyperloglog element [element ...] 对一个或多个集合元素进行计数
PFCOUNT PFCOUNT hyperloglog [hyperloglog ...] 获取hyperloglog计算的近似基数
PFMERGE PFMERGE destination hyperloglog [hyperloglog ...] 将给定的多个hyperloglog计算的并集存储到指定的键中

命令详解

PFADD命令

使用PFADD命令对一个或多个集合元素进行计数:

PFADD hyperloglog element [element ...]

根据给定的元素是否已经进行计数,PFADD命令可能返回0,也可能返回1:

  • 如果给定的元素已经进行过计数,那么PFADD命令将返回0,表示HyperLogLog计算出的近似基数没有发生变化。
  • 与此相反,如果给定的元素中出现了至少一个之前没有进行过计数的元素,导致HyperLogLog计算出的近似基数发生了变化,那么PFADD命令将返回1 。
127.0.0.1:6379> PFADD letters "a" "b" "c"
(integer) 1
127.0.0.1:6379> PFADD letters "a"
(integer) 0

复杂度:O(N)O(N),其中NN为用户给定的元素数量。
版本要求:从Redis 2.8.9版本开始可用。

PFCOUNT命令

使用PFADD命令对元素进行计数之后,可以通过PFCOUNT命令来获取HyperLogLog为集合计算出的近似基数:

PFCOUNT hyperloglog [hyperloglog ...]
127.0.0.1:6379> PFCOUNT letters
(integer) 3

返回并集的近似基数

当用户向PFCOUNT传入多个HyperLogLog时,PFCOUNT命令将对所有给定的HyperLogLog执行并集计算,然后返回并集计算出的近似基数:

127.0.0.1:6379> PFADD letters1 "a" "b" "c"
(integer) 1
127.0.0.1:6379> PFADD letters "c" "d" "e"
(integer) 1
127.0.0.1:6379> PFCOUNT letters1 letters2
(integer) 5

复杂度:O(N)O(N),其中NN为给定的HyperLogLog数量。
版本要求:从Redis 2.8.9版本开始可用。

PFMERGE命令

PFMERGE命令可以对多个给定的HyperLogLog执行并集计算,然后把计算得出的并集HyperLogLog保存到指定的键中:

PFMERGE destination hyperloglog [hyperloglog ...]
127.0.0.1:6379> PFADD numbers1 128 256 512
(integer) 1
127.0.0.1:6379> PFADD numbers2 128 256 512
(integer) 1
127.0.0.1:6379> PFADD numbers3 128 512 1024
(integer) 1
127.0.0.1:6379> PFMERGE union-numbers number1 number2 number3
(integer) 4

PFCOUNT与PFMERGE

PFCOUNT命令在计算多个HyperLogLog的近似基数时会执行以下操作:

  • 在内部调用PFMERGE命令,计算所有给定的HyperLogLog的并集,并将这个并集存储到一个临时的HyperLogLog中。
  • 对临时的HyperLogLog执行PFCOUNT命令,得到它的近似基数(因为这是针对单个HyperLogLog的PFCOUNT,所以这个操作不会引起循环调用)。
  • 删除临时HyperLogLog
  • 向用户返回之前得到的近似基数。

复杂度:O(N)O(N),其中NN为用户给定的HyperLogLog的数量。
版本要求:从Redis 2.8.9版本开始可用。