統計活躍用戶這個案例非常經典,也是我當時學習redis時,接觸到的第一個讓我眼睛一亮的使用方式
場景
用戶登錄后需要記錄,以便以后進行登錄統計
統計需求主要有:
(1)今天的登錄用戶數
(2)3天內都登錄過的用戶
(3)7天內登錄過的用戶
常規解決方案
如果不用redis,通常做法是在用戶登錄時記錄日志,或者在數據庫中添加一條登錄記錄
然后按照需求進行定時統計
redis解決方案
redis的 bit 操作非常適合處理這個場景
因為bit的值為 0或1,用戶是否登錄也可以用 0或1 來表示
我們把每天的用戶登錄信息記錄到一個key中,值中的每個offset的值就是用戶登錄的標識
例如
bit 基本操作示例
(1)設置關鍵字的指定offset的值為 0 或 1
setbit key 100 1
(2)bit運算
例如
key1 -> 0101
key2 -> 0011
and 運算
bitop and ret key1 key2
就是對 key1 key2 各位進行 and 運算后賦值給 ret,結果為 0001
or 運算
bitop or ret key1 key2
就是對 key1 key2 各位進行 or 運算后賦值給 ret,結果為 0111
(3)bit值為1的數量
bitcount key
通過bit操作就可以實現用戶統計的需求了
例如今天為 2016-01-18
把 key 定義為 userlogin:20160118
(1)用戶登錄
ID為 100 的用戶登錄了,執行
setbit userlogin:20160118 100 1
(2)統計今天登錄的用戶數
bitcount userlogin:20160118
(3)統計3天內都登錄過的用戶
“都登錄過”是要取得bit值都為1的,通過 and 計算獲取
bitop or ret userlogin:20160116 userlogin:20160117 userlogin:20160118
(4)統計7天內登錄過的用戶
“登錄過”表示bit值有一個為 1 即可,所以通過 or 計算獲取,命令與上一個類似