在使用redis设计签到系统,我们可以使用集合和bitmaps两种数据结构。这边我们来说明一下bitmaps。
1.bitmaps的数据结构模型
Bitmaps本身不是一种数据结构,它是字符串,但是它可以对字符串的位进行操作。
Bitmaps单独提供了一套命令,所以在Redis中使用Bitmaps和使用字符串的方法不太相同。可以把Bitmaps想象成一个以位为单位的数组,数组的每个单元==只能存储0和1==,数组的下标在Bitmaps中叫做偏移量。
结构表示2.bitmaps的命令说明
(1)设置值
setbit key offset value
设置键的第offset个位的值(从0算起),假设现在有20个用户,uid=0,5,11,15,19的用户对网站进行了访问,
存储的结构127.0.0.1:6379> setbit test:bit 20 1
(integer) 0
127.0.0.1:6379> setbit test:bit 25 1
(integer) 0
setbit命令设置的vlaue只能是0或1两个值
127.0.0.1:6379> setbit test:bit 26 6
(error) ERR bit is not an integer or out of range
注意:虽然便宜量是是20开始的,但是从0-19的依然会占用一点内存
很多应用的用户id以一个指定数字(例如10000)开头,直接将用户id和Bitmaps的偏移量对应势必会造成一定的浪费,通常的做法是每次做setbit操作时将用户id减去这个指定数字。
在第一次初始化Bitmaps时,假如偏移量非常大,那么整个初始化过程执行会比较慢,可能会造成Redis的阻塞。
(2)获取值
127.0.0.1:6379> getbit test:bit 4
(integer) 0
127.0.0.1:6379> getbit test:bit 25
(integer) 1
127.0.0.1:6379> getbit test:bit 100
(integer) 0
获取返回值如果是0有两种情况:一种是没有设置,一种是不存在
(3) 获取Bitmaps指定范围值为1的个数
127.0.0.1:6379> bitcount test:bit 0 20
(integer) 2
127.0.0.1:6379> bitcount test:bit 20 25
(integer) 0
(4) Bitmaps间的运算
bitop op destkey key[key....]
bitop是一个复合操作,它可以做多个Bitmaps的and(交集)、or(并集)、not(非)、xor(异或)操作并将结果保存在destkey中
127.0.0.1:6379> keys test:*
1) "test:bit:01"
2) "test:bit:02"
127.0.0.1:6379> del test:bit:01 test:bit:02
(integer) 2
127.0.0.1:6379> keys test:*
(empty list or set)
127.0.0.1:6379> setbit test:bit:01 15 1
(integer) 0
127.0.0.1:6379> getbit test:bit:01 15
(integer) 1
127.0.0.1:6379> setbit test:bit:01 14 1
(integer) 0
127.0.0.1:6379> setbit test:bit:01 13 1
(integer) 0
127.0.0.1:6379> setbit test:bit:02 14 1
(integer) 0
127.0.0.1:6379> setbit test:bit:02 3 1
(integer) 0
127.0.0.1:6379> bitop or test:bit test:bit:01 test:bit:02
(integer) 2
127.0.0.1:6379> bitcount test:bit
(integer) 4
(5)计算Bitmaps中第一个值为targetBit的偏移量
bitpos key targetBit [start] [end]
比如:
- 计算第10个字节到第20个字节之间
127.0.0.1:6379> bitpos test:bit:01 1 10 20
(integer) -1
- 计算第0个字节到第20个字节之间
127.0.0.1:6379> bitpos test:bit:01 1 0 10
(integer) 13
Bitmaps和集合对比
假设网站有1亿用户,每天独立访问的用户有5千万,如果每天用集合类型和Bitmaps分别存储活跃用户可以。
set和Bitmaps存储一天活跃用户的对比
很明显,这种情况下使用Bitmaps能节省很多的内存空间,尤其是随着
时间推移节省的内存还是非常可观的
set和Bitmaps存储独立用户空间对比 ;
但Bitmaps并不是万金油,假如该网站每天的独立访问用户很少,例如只有10万(大量的僵尸用户),那么两者的对比如表3-5所示,很显然,这时候使用Bitmaps就不太合适了,因为基本上大部分位都是0。
set和Bitmaps存储一天活跃用户的对比(独立用户比较少)
;
网友评论