上一篇: 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 列表