三种特殊数据类型之Hyperloglog&Bitmaps

91 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

Hyperloglog

A(1,3,5,7,8,7)

b(1,3,5,7,8)

基础(不重复的元素)=5 可以接受误差

redis 2.8.9版本就更新了Hyperloglog数据结构

Redis Hyperloglog基数统计算法!

网页的UV(一个人访问一个网站多次,但是还是算一个人)

传统的方式,set保存用户的id,然后就可以统计set中的元素数量作为判断

这个方式如果保存大量用户id,就会比较麻烦,我们的目的是为了技术而不是保存用户id

优点:占用的内存是固定,2^64不同元素的技术,只需要12kB的内存如果要从内存角度来比较的话

有百分之0.81的错误率,统计UV任务,可以忽略不计

pfadd  #添加

pfcount #统计基数数量
pfmerge mykey3 mykey myke2 #合并

如果允许容错的话,可以使用Hyperloglog,如果不允许容错用set或者其他数据结构

例子

127.0.0.1:6379> pfadd key1 a b c d e
(integer) 1
127.0.0.1:6379> pfadd key2 b c d g h
(integer) 1
127.0.0.1:6379> pfmerge key3 ke1 key2
OK
127.0.0.1:6379> pfcount key3
(integer) 5

Bitmaps

位存储

统计用户信息,活跃,不活跃,登录,未登录,打卡,两个状态都可以使用bitmaps

使用bitmap 来记录周一到周日的打卡

setbit sign 0 1

查看某一天是否打卡

getbit sign 3

统计操作,统计打卡天数

bitcount sign #统计打卡记录
127.0.0.1:6379> setbit sign 1 0
(integer) 0
127.0.0.1:6379> setbit sign 2 1
(integer) 0
127.0.0.1:6379> setbit sign 3 1
(integer) 0
127.0.0.1:6379> setbit sign 4 1
(integer) 0
127.0.0.1:6379> setbit sign 5 1
(integer) 0
127.0.0.1:6379> setbit sign 6 1
(integer) 0
127.0.0.1:6379> setbit sign 7 1
(integer) 0
127.0.0.1:6379> getbit sign 2
(integer) 1
127.0.0.1:6379> bitcount sign 1 5
(integer) 0
127.0.0.1:6379> bitcount sign 
(integer) 6