redis學習筆記之-(2)-bitmap用法之2-上億用戶1周連續活躍用戶數統計

上一篇: redis學習筆記之-(1)-bitmap用法之1-統計全部用戶1年的登陸天數redis


2. bitmap使用2:上億個用戶的1周內連續活躍用戶數

2.1 思路

需求2: 上億個用戶,統計一週內連續活躍用戶

100000000/8/1024/1024 = 11.9M 一個bitmap佔用 不到12Mshell

好在一週只有7天, 咱們用7個key的bitmap來存儲狀態便可,segmentfault

加上最後的一個結果res的bitmap: 12*8=100M 內存便可!學習

遵循下面步驟便可:code

  1. 用戶編號是前提, 每一個用戶的編號從1到n(n=就是說的那個上億的最大值);
  2. 聲明7個bitmap, 從週一到週日: mon tue wed thur fri sat sun;
  3. 每一個用戶編號所在的offset在周1若是登陸了, 就是1, 沒登陸就是0;
  4. 7個bitmap都設值記錄;
  5. bitop 對7個bitmap進行位AND操做, 7天都登陸的當天的位上纔是1
  6. 最後的結果進行bitcount操做, 就是上億用戶一週內連續活動的人數!
  7. 若是想知道連續活躍的用戶都有哪些人, 遍歷 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

2.2 前4步: 初始化7個bitmap

週一的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

我去, 數據終於錄入完了, 費勁那個~~

2.3 用bitop對7個bitmap進行位AND操做

127.0.0.1:6379> bitop and res mon tue wed thur fri sat sun
(integer) 1

2.4 bitcount對結果bitmap, 見證奇蹟的時刻到了

127.0.0.1:6379> bitcount res
(integer) 3

2.5 想知道連續活躍的用戶都有哪些人

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

2.6 擴展:

若是需求是: 求一週內活躍過的用戶數: 只要將 上面命令中bitop and 改成: bitop or 便可~

連續 的話要求是AND, 活躍過 的話, 只要有一天就能夠

over!

2.7 小結

bitmap的操做命令:

  • setbit key offset value
  • getbit key offset
  • bitcount key [start end]
  • bitop operation destkey [key ...]

    operation: 支持 AND/OR/NOT/XOR四種操做,除NOT 外,其餘操做均可接受一個或多個 key 做輸入

    destkey: 後面全部 key([key...])的與或非異或操做的結果存入一個目標key, 取個名字!

    key... 能夠n個key作 與或非異或操做, 傳入這些bitmap的key 列表

相關文章
相關標籤/搜索