Redis数据类型 - HyperLogLog

文章目录

一、HyperLogLog简介

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

HyperLogLog的有点在于它计算近似基数所需要的内存并不会因为集合的大小而改变,无论集合包含的元素有多少个,HyperLogLog进行计算所需的内存总是固定的,而且是非常少的,Redis的每个HyperLogLog只需要使用12KB内存空间,就可以对接近2的64个元素进行计数,且算法的标准误差仅为0.81%。

总的来说,HyperLogLog不关心集合中的元素,只关心集合中元素的数量

二、HyperLogLog常用操作

  • 对集合元素进行计数

可通过PFADD命令,使用HyperLogLog对给定的一个或多个集合进行计数,这里对于HyperLogLog相关命令的统一前缀PF,似乎与HyperLogLog并无关系,其实PF是HyperLogLog算法提出者Philippe Flajolet的简写
语法格式:PFADD key element1 element2 … ,如

# 对集合元素a、b、c 进行计数,并将结果关联到键 chars中
PFADD chars 'a' 'b' 'c'

如果给定的所有元素都已经进行过计数,那么PFADD命令将返回0,表示HyperLogLog 计算出的近似基数没有发生变化;与此相反,如果给定的元素中出现了至少一个之前没有进行过计数的元素,那么PFADD命令将返回1。

  • 获取集合的近似基数

在使用PFADD命令对元素进行计数之后,key使用PFCOUNT命令来获取HyperLogLog为集合计算出的近似基数
语法格式:PFCOUNT key1 key2 … ,如

# 获取chars对应的近似基数,此时为3
PFCOUNT chars

挡指定的HyperLogLog不存在时,PFCOUNT命令将返回0作为结果

当PFCOUNT命令中指定多个key时,PFCOUNT命令将对所有给定的HyperLogLog执行并集计算,然后返回并集HyperLogLog计算出的近似基数,如

PFADD chars2 'c' 'd' 'e'
# 获取chars和chars2并集计算出的近似基数,此时为5
PFCOUNT chars chars2

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

  • 计算并保存多个HyperLogLog的并集

PFMERGE命令可以对多个给定的HyperLogLog执行并集计算,然后把计算得出的并集HyperLogLog 保存到指定的键中
语法格式:PFMERGE destination key1 key2 … ,如

# 将chars和chars执行并集计算后的结果存储到chars3中
PFMERGE chars3 chars chars2

如果指定的键已经存在,那么PFMERGE命令将覆盖已有的键,PFMERGE命令在成功执行并集计算之后将返回OK作为结果。

上一篇:字母异位词分组


下一篇:(map集合应用)统计出其中英文字母、空格、数字和其它字符的数量