上一篇: redis学习笔记之-(1)-bitmap用法之1-统计全部用户1年的登陆天数redis
需求2: 上亿个用户,统计一周内连续活跃用户
100000000/8/1024/1024 = 11.9M 一个bitmap占用 不到12Mshell
好在一周只有7天, 咱们用7个key的bitmap来存储状态便可,segmentfault
加上最后的一个结果res的bitmap: 12*8=100M 内存便可!学习
遵循下面步骤便可:code
bitcount
操做, 就是上亿用户一周内连续
活动的人数!getbit 每一天的key(mon/tue/...) id
便可!示例: 咱们模拟5个用户吧:内存
用户ID | mon | tue | wed | thur | fri | sat | sun |
---|---|---|---|---|---|---|---|
001 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
002 | 0 | 0 | 0 | 0 | 0 | 1 | 1 |
003 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
004 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
005 | 0 | 1 | 0 | 1 | 0 | 1 | 1 |
周一的key: mon, 周一全部用户的登陆状态记录:get
127.0.0.1:6379> setbit mon 1 1 (integer) 0 127.0.0.1:6379> setbit mon 2 0 (integer) 0 127.0.0.1:6379> setbit mon 3 1 (integer) 0 127.0.0.1:6379> setbit mon 4 1 (integer) 0 127.0.0.1:6379> setbit mon 5 0 (integer) 0
周二的key: tue, 全部用户的登陆状态记录:it
127.0.0.1:6379> setbit tue 1 1 (integer) 0 127.0.0.1:6379> setbit tue 2 0 (integer) 0 127.0.0.1:6379> setbit tue 3 1 (integer) 0 127.0.0.1:6379> setbit tue 4 1 (integer) 0 127.0.0.1:6379> setbit tue 5 1 (integer) 0
周三的key: wed, 全部用户的登陆状态记录:io
127.0.0.1:6379> setbit wed 1 1 (integer) 0 127.0.0.1:6379> setbit wed 2 0 (integer) 0 127.0.0.1:6379> setbit wed 3 1 (integer) 0 127.0.0.1:6379> setbit wed 4 1 (integer) 0 127.0.0.1:6379> setbit wed 5 0 (integer) 0
周四的key: thur, 全部用户的登陆状态记录:table
127.0.0.1:6379> setbit thur 1 1 (integer) 0 127.0.0.1:6379> setbit thur 2 0 (integer) 0 127.0.0.1:6379> setbit thur 3 1 (integer) 0 127.0.0.1:6379> setbit thur 4 1 (integer) 0 127.0.0.1:6379> setbit thur 5 1 (integer) 0
周五的key: fri, 全部用户的登陆状态记录:
127.0.0.1:6379> setbit fri 1 1 (integer) 0 127.0.0.1:6379> setbit fri 2 0 (integer) 0 127.0.0.1:6379> setbit fri 3 1 (integer) 0 127.0.0.1:6379> setbit fri 4 1 (integer) 0 127.0.0.1:6379> setbit fri 5 0 (integer) 0
周六的key: sat, 全部用户的登陆状态记录:
127.0.0.1:6379> setbit sat 1 1 (integer) 0 127.0.0.1:6379> setbit sat 2 1 (integer) 0 127.0.0.1:6379> setbit sat 3 1 (integer) 0 127.0.0.1:6379> setbit sat 4 1 (integer) 0 127.0.0.1:6379> setbit sat 5 1 (integer) 0
周日的key: sun, 全部用户的登陆状态记录:
127.0.0.1:6379> setbit sun 1 1 (integer) 0 127.0.0.1:6379> setbit sun 2 1 (integer) 0 127.0.0.1:6379> setbit sun 3 1 (integer) 0 127.0.0.1:6379> setbit sun 4 1 (integer) 0 127.0.0.1:6379> setbit sun 5 1 (integer) 0
我去, 数据终于录入完了, 费劲那个~~
127.0.0.1:6379> bitop and res mon tue wed thur fri sat sun (integer) 1
127.0.0.1:6379> bitcount res (integer) 3
getbit res 1
表示 用户编号为1的结果: 1说明用户ID=1的, 7天都活跃!
5个用户结果以下:
127.0.0.1:6379> getbit res 1 (integer) 1 127.0.0.1:6379> getbit res 2 (integer) 0 127.0.0.1:6379> getbit res 3 (integer) 1 127.0.0.1:6379> getbit res 4 (integer) 1 127.0.0.1:6379> getbit res 5 (integer) 0
若是需求是: 求一周内活跃过的用户数: 只要将 上面命令中bitop and
改成: bitop or
便可~
连续 的话要求是AND, 活跃过 的话, 只要有一天就能够
over!
bitmap的操做命令:
operation: 支持 AND/OR/NOT/XOR四种操做,除NOT 外,其余操做均可接受一个或多个 key 做输入
destkey: 后面全部 key([key...])的与或非异或
操做的结果存入一个目标key, 取个名字!
key... 能够n个key作 与或非异或
操做, 传入这些bitmap的key 列表