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

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

;

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 重点参考链接: http://www.cnblogs.com/wangyuyu/p/3786236.html Re...
    Kevin_Junbaozi阅读 2,195评论 0 21
  • 转载地址:http://gnucto.blog.51cto.com/3391516/998509 Redis与Me...
    Ddaidai阅读 21,465评论 0 82
  • Redis key 值是二进制安全的,这意味着可以用任何二进制序列作为key值,从形如”foo”的简单字符串到一个...
    壹点零阅读 1,435评论 0 2
  • redis是什么 redis是一个开源的、使用C语言编写的、支持网络交互的、可基于内存也可持久化的Key-Valu...
    烨枫_邱阅读 787评论 0 6
  • 年后没过多久就搬进了会议室,尽管它不黑,大家还是叫它小黑屋,由此可知,不好受。相对狭小封闭的空间,时间一长,令人倍...
    xxwade阅读 297评论 0 1