那什么是基数?
A {1,3,5,7,8,7}
B {1,3,5,7,8}
基数用大白话来讲解,就是一个集合中不重复的元素,可以接受误差
那集合A与集合B的基数都是5
Redis2.8.9版本就已经更新了,Hyperloglog是一种数据结构
Hyperloglog 是基数统计的算法
优点:
占用的内存是固定的,
如果要存数据,hyperloglog存2^64的数据只需要占用12kb内存
如果要从内存角度比较,hyperloglog首选
实际场景:
网页的UV(页面访问量用户数):
一个人访问一个网站多次,最后还是算作一个人
传统方式: 使用set集合保存用户id,因为set集合中不允许元素重复,我们就可以统计set集合中的元素数量,作为标准判断
但是如果用set集合保存用户id,有的用户id是分布式的,特别特别长,这个方式如果保存大量的用户id,就会比较麻烦,因为比较占内存
我们的目的是为了计数,而并不是保存用户id
现在我们有了hyperloglog特殊数据类型后,就可以基于基数来计算访问量
所有的关于hyperloglog的命令都是以p开头的
pfadd 新增
pfcount 统计基数
##新增元素 127.0.0.1:6379> pfadd hyper1 a b c d e f (integer) 1 ##统计基数 127.0.0.1:6379> pfcount hyper1 (integer) 6 ##新增元素 127.0.0.1:6379> pfadd hyper2 g h i l k (integer) 1 ##统计基数 127.0.0.1:6379> pfcount hyper2 (integer) 5 ##新增元素 127.0.0.1:6379> pfadd hyper3 a a a b e r d (integer) 1 ##统计基数 127.0.0.1:6379> pfcount hyper3 (integer) 5 127.0.0.1:6379>pfmerge destkey sourcekey [sourcekey …]
##新增元素 127.0.0.1:6379> pfadd hyper1 a b c d e f (integer) 1 ##统计基数 127.0.0.1:6379> pfcount hyper1 (integer) 6 ##新增元素 127.0.0.1:6379> pfadd hyper2 g h i l k (integer) 1 ##统计基数 127.0.0.1:6379> pfcount hyper2 (integer) 5 ##新增元素 127.0.0.1:6379> pfadd hyper3 a a a b e r d (integer) 1 ##统计基数 127.0.0.1:6379> pfcount hyper3 (integer) 5 ##合并,做并集运算 127.0.0.1:6379> pfmerge hyper4 hyper1 hyper2 hyper3 OK ##统计基数 127.0.0.1:6379> pfcount hyper4 (integer) 12 127.0.0.1:6379>以后我们要是需要做计数场景,都可以使用hyperloglog,只要允许容错,它有0.81%的错误率,如果不允许容错,就可以使用set或者自己的数据类型即可