HyperLogLog(基数统计)
什么是基数?
不相同的数叫做基数。
问题的引入:
在传统时期,如果你要计算一个网页的访问量,如何计算?做法是将用户的唯一标识存入一个set集合中,然后获取set的集合元素的大小。当集合元素量比较小的时候,效果还行,当用户量超大时,这个集合或者多个集合占用的储存量太大了。我们只不过想要个访问量这个数字而已,但却要存储这么多无效信息,不划算。
HyperLogLog不是集合,不会存储元素本身,而是添加的时候计数不重复元素的一种算法,不是redis独有的。当添加量非常大时,存在0.81%标准误差。HyperLogLog最大只占12KB内存,可以计算近264元素的基数。
如果你用集合去存264个元素,内存多少?可以自己算算。
假设存long型数字,一个long型8个字节,即8B,(264 * 8)/ (1024 * 1024 * 1024) = 237 G,再看看自己电脑几个G,根本无法存这么多。
HyperLogLog的应用场景:访问量,在线人数,搜索次数,注册人数,等待。
HyperLogLog命令只有三个:PFadd添加,PFcount获取基数,PFmerge合并
常用命令:
(1)添加基数:PFadd key element [element…]
返回值:基数发生改变返回1,未改变返回0。
当不指定元素,即PFadd key时,key不存在时创建一个空的key,返回1。
(2)获取基数:PFcount key [key…]
(3)基数合并:PFmerge destKey sourceKey [sourceKey…]
合并后的基数近似所有输入元素的基数。