redis学习(九)

redis学习(九)

hyperloglog

什么是基数?

基数(cardinal number)在数学上,是集合论中刻画任意集合大小的一个概念。两个能够建立元素间一一对应的集合称为互相对等集合。例如3个人的集合和3匹马的集合可以建立一一对应,是两个对等的集合。

Redis 2.8.9 版本就更新了 Hyperloglog 数据结构!
Redis Hyperloglog 基数统计的算法!

优点:占用的内存是固定,2^64 不同的元素的技术,只需要废 12KB内存!如果要从内存角度来比较的
话 Hyperloglog 首选!
网页的 UV (一个人访问一个网站多次,但是还是算作一个人!)
传统的方式, set 保存用户的id,然后就可以统计 set 中的元素数量作为标准判断 !
这个方式如果保存大量的用户id,就会比较麻烦!我们的目的是为了计数,而不是保存用户id;
0.81% 错误率! 统计UV任务,可以忽略不计的!

127.0.0.1:6666> pfadd key a b c d e f g h i j # 创建第一个
(integer) 1
127.0.0.1:6666> pfcount key 
(integer) 10
127.0.0.1:6666> pfadd key1 i j z x c v b n m 
(integer) 1
127.0.0.1:6666> pfcount key1
(integer) 9
127.0.0.1:6666> pfmerge key2 key key1 # 将两个合并
OK
127.0.0.1:6666> pfcount key2 # 看合并的数量
(integer) 15

如果允许容错,那么一定可以使用 Hyperloglog !
如果不允许容错,就使用 set 或者自己的数据类型即可!

bitmap

位存储。

统计用户信息,活跃,不活跃!
登录 、 未登录! 打卡,365打卡! 两个状态的,都可以使用
Bitmaps!
Bitmap 位图,数据结构! 都是操作二进制位来进行记录,就只有0 和 1 两个状态!
365 天 = 365 bit 1字节 = 8bit 46 个字节左右!

使用bitmap 来记录 周一到周日的打卡!
周一:1 周二:0 周三:0 周四:1 ......

127.0.0.1:6666> setbit sign 0 1 # 是否打卡,0已打卡,1未打。(规则自己定。)
(integer) 0
127.0.0.1:6666> setbit sign 1 0
(integer) 0
127.0.0.1:6666> setbit sign 2 0
(integer) 0
127.0.0.1:6666> setbit sign 3 1
(integer) 0
127.0.0.1:6666> setbit sign 4 1
(integer) 0
127.0.0.1:6666> setbit sign 5 0
(integer) 0
127.0.0.1:6666> setbit sign 6 0
(integer) 0
127.0.0.1:6666> getbit sign 3 # 获取周三。
(integer) 1
127.0.0.1:6666> getbit sign 6
(integer) 0
127.0.0.1:6666> bitcount sign # 这周三个0,也就是打卡三天。
(integer) 3