Redis数据类型 之 HyperLogLog

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/lianghecai52171314/article/details/102730925

Redis数据类型 之 HyperLogLog

基数统计(HyperLogLog)
基数是一种算法。比如一本英文著作由几百万个单词组成,但英文单词本身是有限的,在这几百万个单词中有许多重复的单词,去掉重复的,内存就足够存储了。比如数字集合{1,2,5,7,9,1,5,9}的基数集合为{1,2,5,7,9},那么基数为5。基数的作用是评估大约需要准备多少个存储单元去存储数据。基数不能存储元素。
HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的。但是HyperLogLog也存在缺点,就是它是估计基数的算法,所以会有一定误差,而且无法获取具体的元素值。因此应用在对准确性不是很重要的场景,例如:QQ同时在线人数,网站IP访问数量等。
HyperLogLog是用来做基数统计的,它的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总量是固定很小的。在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基数。因为HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身。

HyperLogLog常用命令:

  • PFADD
    将指定的元素添加到指定的HyperLogLog 结构中。
    如果一个HyperLogLog的估计的近似基数在执行命令过程中发了变化, PFADD 返回1,否则返回0。
    在这里插入图片描述

  • PFCOUNT
    参数为一个key时,返回存储在HyperLogLog结构体的该变量的近似基数;如果该变量不存在,则返回0。
    当参数为多个key时,返回这些HyperLogLog的并集的近似基数,这个值是将所有给定key的HyperLoglog结构合并到一个临时的HyperLogLog结构中计算而得到的。
    返回的可见集合基数并不是精确值, 而是一个带有 0.81% 标准错误(standard error)的近似值。
    在这里插入图片描述

  • PFMERGE
    将多个 HyperLogLog 合并(merge)为一个 HyperLogLog,合并后的 HyperLogLog 的基数接近于所有输入 HyperLogLog 的可见集合(observed set)的并集。
    合并得出的 HyperLogLog 会被储存在目标变量(第一个参数)里面,如果该键并不存在, 那么命令在执行之前, 会先为该键创建一个空的。
    在这里插入图片描述

具体应用:计算网站每天访问的独立IP数量。如果使用 set 集合存储每个 ip 的话,1个IP就需要占15个字节(xxx.xxx.xxx.xxx),如果每天有很多用户访问,需要统计很多天,则需要耗费很大的内存空间进行存放。而使用HyperLogLog,每天只需要12KB,占用的内存空间大大减少。

猜你喜欢

转载自blog.csdn.net/lianghecai52171314/article/details/102730925