Bitmaps
uid=0,5,11,15,19
使用Bitmap来保存用户是否访问过网站
hadoop:6379> setbit users_2020-10-24 0 1#将0位设置为1,0是偏移量
(integer) 0
hadoop:6379> setbit users_2020-10-24 5 1#将5位设置为1,5是偏移量
(integer) 0
hadoop:6379> setbit users_2020-10-24 11 1
(integer) 0
hadoop:6379> setbit users_2020-10-24 15 1
(integer) 0
hadoop:6379> setbit users_2020-10-24 19 1
(integer) 0
获取指定用户是否访问过网站
hadoop:6379> getBit users_2020-10-24 0
(integer) 1
统计2020-10-24这一天一共有多少用户访问了网站
hadoop:6379> bitcount users_2020-10-24 0 -1
(integer) 5
计算2020-10-24与2020-10-25的所有访问网站的用户
hadoop:6379> setbit users_2020-10-25 0 1
(integer) 0
hadoop:6379> setbit users_2020-10-25 6 1
(integer) 0
hadoop:6379> setbit users_2020-10-25 12 1
(integer) 0
取or操作
hadoop:6379> bitop or users_or_2020-10-24_25 users_2020-10-24 users_2020-10-25
(integer) 3
bitop operate destKey key1 [key2..]
对指定key按位进行交、并、异或操作,并将结果保存到destKey中。
and:交
or:并
not:非
xor:异或
取数量
bitcount key [start end]
统计指定key中1的数量。
hadoop:6379> bitcount users_or_2020-10-24_25 0 -1
(integer) 7
小结:
- Bitmap存储的值只能是0或者1,是信息的状态位统计
- 理解Bitmaps:就是一个存储0、1的一维数组
- 操作Bitmaps的时候,必须要带上一个offset(偏移量)
HyperLogLog
求某个网站的uv值
#1.添加数据
hadoop:6379> pfadd taobao:uv:2020-10-24 1
(integer) 1
hadoop:6379> pfadd taobao:uv:2020-10-24 2
(integer) 1
hadoop:6379> pfadd taobao:uv:2020-10-24 1
(integer) 0
获取uv的值
#2.统计数据
hadoop:6379> pfcount taobao:uv:2020-10-24
(integer) 2
小结:
- 只用来做一些去重的、大数据量的统计(uv)
- 限制:HyperLogLog结构存在一定的误差,误差很小,0.81%。所以它不适合对精确度要求特别高的统计。这种操作,对精确度要求没那么高,可以使用该结构
- HyperLogLog结构不存储数据,只记录数据量。针对uv场景,它为了节省空间资源,只会存储数据经过算法计算后的基数值,基于基数值来进行统计的。