redis学习---位图统计活跃用户

位图

位图,就是用每位来表示存放的某种状态,但是适用于状态不多的情况。在redis中,字符串是以二进制的形式存储的,因此位图在redis中并不是一种数据类型,而是一种字符串的表现形式。

setbit key offset value [设置offset对应的二进制位上的值]

在使用上述操作之前,我们先来解释offset的含义。举个栗子,a的ASCII的值是97,它的二进制表示0110 0001,其中offset偏移的值代表每个位所代表的的位置的值,如offset=0,值为0;offset=3,值为0;offset=7,值为1;从上面可以推出,offset的值是从0开始的,因为字符串类型最多存储512M字节,offset最大不得超过2^32-1.

好了,解释出了offset的含义,对于使用这个操作就应该比较的轻松了,那现在我们再来举个栗子,如何使用这个操作。比如,现在我们要将小写的a,转换成大写字母A,我们先将大写字母A所代表的二进制求解出来,A的ASCII为65,二进制为0100 0001,我们可以发现,只要我们将a中offset=2的值置为0,即把a变成A。具体操作,如下:

127.0.0.1:6379> set charact a
OK
127.0.0.1:6379> setbit charact 2 0
(integer) 1
127.0.0.1:6379> get charact
"A"
bitop operation destkey key1 …

对一个或多个保存二进制位的字符串 key 进行位元操作,并将结果保存到 destkey 上。

其中operation可以是AND(逻辑并),OR(逻辑或),NOT(逻辑异或),XOR(逻辑异或)

老规矩,给个例子,熟悉下这个操作,将A转换成a的栗子。从上面我们知道a的二进制表示为0100 0001,然后我们用0100 0000进行逻辑或操作,即可达到我们想要的效果,废话不多说,看如下从操作。

127.0.0.1:6379> SETBIT temp 7 0
(integer) 0
127.0.0.1:6379> setbit temp 2 1
(integer) 0
127.0.0.1:6379> set charact A
OK
127.0.0.1:6379> set charact A
OK
127.0.0.1:6379> BITOP or charact charact temp
(integer) 1
127.0.0.1:6379> get charact
"a"
统计在线人数

场景:统计一周内,连续登录的人数.

思路:
  • 我们将所用的用户生成一个位图(0/1 未登录/登录)
  • 进行and操作
数据

每天登录的用户(例如[1,3,5,8]代表,用户1,3,5,8登录过):

  • 星期一[1,3,5,8]
  • 星期一[1,3,5,7]
  • 星期一[1,3,5]
  • 星期一[1,2,3,4,5]
  • 星期一[1,3,4,5]
  • 星期一[1,3,5]
  • 星期一[1,3,4,5,7]
操作
127.0.0.1:6379> setbit mon 1 1
(integer) 0
127.0.0.1:6379> setbit mon 3 1
(integer) 0
127.0.0.1:6379> setbit mon 5 1
(integer) 0
127.0.0.1:6379> setbit mon 8 1
(integer) 0
127.0.0.1:6379> setbit tues 1 1
(integer) 0
127.0.0.1:6379> setbit tues 3 1
(integer) 0
127.0.0.1:6379> setbit tues 5 1
(integer) 0
127.0.0.1:6379> setbit tues 7 1
(integer) 0
127.0.0.1:6379> setbit wed 1 1
(integer) 0
127.0.0.1:6379> setbit wed 3 1
(integer) 0
127.0.0.1:6379> setbit wed 5 1
(integer) 0
127.0.0.1:6379> setbit thur 1 1
(integer) 0
127.0.0.1:6379> setbit thur 2 1
(integer) 0
127.0.0.1:6379> setbit thur 3 1
(integer) 0
127.0.0.1:6379> setbit thur 4 1
(integer) 0
127.0.0.1:6379> setbit thur 5 1
(integer) 0
127.0.0.1:6379> setbit fri 1 1
(integer) 0
127.0.0.1:6379> setbit fri 3 1
(integer) 0
127.0.0.1:6379> setbit fri 4 1
(integer) 0
127.0.0.1:6379> setbit fri 5 1
(integer) 0
127.0.0.1:6379> setbit sat 1 1
(integer) 0
127.0.0.1:6379> setbit sat 3 1
(integer) 0
127.0.0.1:6379> setbit sat 5 1
(integer) 0
127.0.0.1:6379> setbit sun 1 1
(integer) 0
127.0.0.1:6379> setbit sun 3 1
(integer) 0
127.0.0.1:6379> setbit sun 4 1
(integer) 0
127.0.0.1:6379> setbit sun 5 1
(integer) 0
127.0.0.1:6379> setbit sun 7 1
(integer) 0
127.0.0.1:6379> bitop and result  mon tues wed thur fri sat sun 
(integer) 2
127.0.0.1:6379> BITCOUNT result
(integer) 3

从上次操作中,我们可以看出,连续登录一周的人数有3位。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值