redis-Hyperloglog

57 阅读1分钟

什么是基数

A{1,3,5,7,8,7} B{1,3,5,7,8}

基数:是指一个集合中不重复元素的个数,这里集合和我们学过的严格定义的集合不同,允许存在重复元素,如给定这样的一个集合{1,2,3,1,2} 它有五个元素,基数是3 ,可以是3

简介

Redis 2.8.9 版本更新了Hyperloglog数据结构

Redis Hyperloglog 是用来做基数统计的算法

优点:占用的内存是固定的, 2^64(Long类型) 不同元素的基数,只需要使用12kb的内存

缺点:会有0.81%的错误率,不过用来统计UV任务,这点误差是可以忽略不计的

应用场景

传统方式 使用set 集合来保存用户的id , 因为set不允许存储重复的值, 可以统计set中的元素作为数量判断

这个方式如果保存大量的用户id 就会比较麻烦,会消耗大量的储存空间,我们的目的只是为了计算有多少用户,并不是为了存储这些用户的ID

如何使用

127.0.0.1:6379> pfadd mykey a b c d e f g
(integer) 1
127.0.0.1:6379> pfadd mykey2 a b c d e f g i k
(integer) 1
127.0.0.1:6379> pfmerge mykey3 mykey mykey2 //将两个集合合并到一起
OK 
127.0.0.1:6379> pfcount mykey3   // 不重复的元素个数为9
(integer) 9

如果允许容错一定可以使用Hyperloglog !

如果不允许容错,就需要使用set 或自己的数据类型 (效率较低,占用内存比较大)