ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

Redis数据类型 - HyperLogLog

2021-10-04 11:00:30  阅读:208  来源: 互联网

标签:PFCOUNT HyperLogLog 数据类型 chars Redis 近似 集合 基数


文章目录

一、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作为结果。

标签:PFCOUNT,HyperLogLog,数据类型,chars,Redis,近似,集合,基数
来源: https://blog.csdn.net/qq_38515961/article/details/120601405

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有