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

HyperLogLog简介

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

HyperLogLog的优点

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

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

HyperLogLog命令速查表

命令用法及参数说明
PFADDPFADD hyperloglog element [element ...]对一个或多个集合元素进行计数
PFCOUNTPFCOUNT hyperloglog [hyperloglog ...]获取hyperloglog计算的近似基数
PFMERGEPFMERGE 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) O(N),其中 N N N为用户给定的元素数量。
版本要求:从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) O(N),其中 N N N为给定的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) O(N),其中 N N N为用户给定的HyperLogLog的数量。
版本要求:从Redis 2.8.9版本开始可用。

上一篇:Redis学习手册5—数据结构之有序集合

下一篇:Redis学习手册7—数据结构之位图

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值