4.5 HyperLogLog

  基于HyperLogLog算法,极小空间完成独立数量统计,本质还是字符串。算法描述参考维基百科介绍,实现起来50行代码左右的样子。

  HyperLogLog提供了两个指令pfadd和 pfcount,⼀个是增加计数,⼀个是获取计数。pfadd ⽤法和set集合的sadd是⼀样的,pfcount和scard⽤法是⼀样的,直接获取计数值。

PFADD key element [element …]

  将任意数量的元素添加到指定的HyperLogLog里面。

PFCOUNT key [key …]

  计算hyperloglog的独立总数

prmerge destkey sourcekey [sourcekey…]

  合并多个hyperloglog

127.0.0.1:6379> pfadd unique_ids1 'uuid_1' 'uuid_2' 'uuid_3' 'uuid_4'       # 向unique_ids1中添加4个元素
(integer) 1
127.0.0.1:6379> pfcount unique_ids1         # 查看unique_ids1中元素的个数
(integer) 4
127.0.0.1:6379> pfadd unique_ids1 'uuid_1' 'uuid_2' 'uuid_3' 'uuid_10'      # 再次向unique_ids1中添加4个元素
(integer) 1
127.0.0.1:6379> pfcount unique_ids1         # 由于两次添加的value有重复,所以unique_ids1中只有5个元素
(integer) 5
127.0.0.1:6379> pfadd unique_ids2 'uuid_1' 'uuid_2' 'uuid_3' 'uuid_4'       # 向unique_ids2中添加4个元素
(integer) 1
127.0.0.1:6379> pfcount unique_ids2         # 查看unique_ids2中元素的个数
(integer) 4
127.0.0.1:6379> pfadd unique_ids2 'uuid_4' 'uuid_5' 'uuid_6' 'uuid_7'       # 再次向unique_ids2中添加4个元素
(integer) 1
127.0.0.1:6379> pfcount unique_ids2         # 再次查看unique_ids2中元素的个数,由于两次添加的元素中有一个重复,所以有7个元素
(integer) 7
127.0.0.1:6379> pfmerge unique_ids1 unique_ids2     # 合并unique_ids1和unique_ids2
OK
127.0.0.1:6379> pfcount unique_ids1         # unique_ids1和unique_ids2中有重复元素,所以合并后的hyperloglog中只有8个元素
(integer) 8

  hyperloglog也有非常明显的局限性:

  • hyperloglog有一定的错误率,在使用hyperloglog进行数据统计的过程中,hyperloglog给出的数据不一定是对的。按照维基百科的说法,使用hyperloglog处理10亿条数据,占用1.5Kb内存时,错误率为2%
  • 没法从hyperloglog中取出单条数据,这很容易理解,使用16KB的内存保存100万条数据,此时还想把100万条数据取出来,显然是不可能的

  所以具体的应用还需要考量实际的场景。

版权声明: 本文为智客工坊「沉晓」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

results matching ""

    No results matching ""