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

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

作者: PHP的艺术编程 | 来源:发表于2019-01-29 16:46 被阅读0次

    在使用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存储一天活跃用户的对比(独立用户比较少)

    ;

    相关文章

      网友评论

          本文标题:redis的bitmaps的应用-网站签到的设计和网站的数据统计

          本文链接:https://www.haomeiwen.com/subject/xudsjqtx.html