redis的bitmaps的应用-网站签到的设计和网站的数据统计

在使用redis设计签到系统,我们可以使用集合和bitmaps两种数据结构。这边我们来说明一下bitmaps。

1.bitmaps的数据结构模型

Bitmaps本身不是一种数据结构,它是字符串,但是它可以对字符串的位进行操作。

Bitmaps单独提供了一套命令,所以在Redis中使用Bitmaps和使用字符串的方法不太相同。可以把Bitmaps想象成一个以位为单位的数组,数组的每个单元==只能存储0和1==,数组的下标在Bitmaps中叫做偏移量。

15297247-331d862a92eaaf08.png
结构表示

2.bitmaps的命令说明

(1)设置值

setbit key offset value

设置键的第offset个位的值(从0算起),假设现在有20个用户,uid=0,5,11,15,19的用户对网站进行了访问,

15297247-e1f2ba2d3afd8e47.jpg
存储的结构
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分别存储活跃用户可以。


15297247-7edb2336ce7bbac9.jpg
set和Bitmaps存储一天活跃用户的对比

很明显,这种情况下使用Bitmaps能节省很多的内存空间,尤其是随着
时间推移节省的内存还是非常可观的


15297247-6285004c7363af47.jpg
set和Bitmaps存储独立用户空间对比
;
但Bitmaps并不是万金油,假如该网站每天的独立访问用户很少,例如只有10万(大量的僵尸用户),那么两者的对比如表3-5所示,很显然,这时候使用Bitmaps就不太合适了,因为基本上大部分位都是0。
15297247-149cc63915a49580.jpg
set和Bitmaps存储一天活跃用户的对比(独立用户比较少)

;

猜你喜欢

转载自blog.csdn.net/weixin_33889665/article/details/87491345