Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的。

  在 Redis 里面,每个HyperLogLog键只需要花费12KB内存,就可以计算接近2^64个不同元素的基数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。

  但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog不能像集合那样,返回输入的各个元素。

什么是基数?

  比如数据集 {1, 3, 5, 7, 5, 7, 8}, 那么这个数据集的基数集为 {1, 3, 5 ,7, 8}, 基数(不重复元素)为5,跟集合一样,具有唯一性。 基数估计就是在误差(标准差小于1%)可接受的范围内,快速计算基数。所以在进行使用时需要权衡。

HLL类型的命令都使用PF开头,是致敬HLL数据结构的发明者Philippe Flajolet;

相关命令

PFADD、PFCOUNT、PFMERGE

操作

1、使用PFADD添加数据

127.0.0.1:6379> PFADD hll_1 zhang
(integer) 1
127.0.0.1:6379> PFADD hll_1 yang
(integer) 1
127.0.0.1:6379> PFADD hll_1 li
(integer) 1
127.0.0.1:6379> PFADD hll_1 zhang #添加相同数据返回0
(integer) 0

2、使用PFCOUNT命令获取数量

127.0.0.1:6379> PFCOUNT hll_1
(integer) 3

3、使用PFMERGE命令合并

#新增一个hll_2
127.0.0.1:6379> PFADD hll_2 zhang
(integer) 1
127.0.0.1:6379> PFADD hll_2 he
(integer) 1
127.0.0.1:6379> PFADD hll_2 liu
(integer) 1

#将hll_1、hll_2合并到hll_3中
127.0.0.1:6379> PFMERGE hll_3 hll_1 hll_2
OK
127.0.0.1:6379> PFCOUNT hll_3
(integer) 5