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

;

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,324评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,356评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,328评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,147评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,160评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,115评论 1 296
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,025评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,867评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,307评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,528评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,688评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,409评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,001评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,657评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,811评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,685评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,573评论 2 353

推荐阅读更多精彩内容

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