redis點陣圖法統計活躍使用者
阿新 • • 發佈:2019-02-10
redis解決實際問題-----點陣圖法統計活躍使用者
今天在學習redis時,在網上看到了這樣的一個問題:
1、一億使用者,使用者有頻繁登入的,也有不經常登陸的
2、如何記錄使用者的登入資訊
3、如何來查詢活躍使用者,【如一週內登入三次】
解決思路:
1、用資料庫解決
如果用資料庫解決,將使用者的登入資訊都放在表中,這時,資料庫的表會急劇增大
同時,要用到group,sum運算,計算較慢,頻繁的訪問資料庫
2、點陣圖法
設登入的使用者為1,沒有登入的使用者為0
那麼一億的使用者的登入狀態資訊儲存容量就不是很大了
如:0100 0001
這樣就表示2號和8號使用者當天是登入的,其他使用者都是沒有登入的
至於如何來判斷查詢使用者是否為活躍:
則可以將一週內的點陣圖進行and計算
如,其中的7位使用者在週一的登入狀態是010 0010
週二的狀態是110 0010
週三的狀態是111 1100
判斷此三天7位使用者有哪些是連續登入的,執行and操作就可以了:010 0000
可以看出只有2號使用者是三天連續登入的。
實際解決辦法:
127.0.0.1:6379> setbit monday 100000000 0
(integer) 0
127.0.0.1:6379> setbit monday 2 1
(integer) 0
127.0.0.1:6379> setbit monday 7 1
(integer) 0
127.0.0.1:6379> setbit monday 5 1
(integer) 0
127.0.0.1:6379> setbit thurday 100000000 0
(integer) 0
127.0.0.1:6379> setbit thurday 5 1
(integer) 0
127.0.0.1:6379> setbit thurday 8 1
(integer) 0
127.0.0.1:6379> setbit thurday 7 1
(integer) 0
127.0.0.1:6379> setbit wednesday 100000000 0
(integer) 0
127.0.0.1:6379> setbit wednesday 2 1
(integer) 0
127.0.0.1:6379> setbit wednesday 5 1
(integer) 0
127.0.0.1:6379> setbit wednesday 8 1
(integer) 0
127.0.0.1:6379> setbit wednesday 7 1
(integer) 0
127.0.0.1:6379> bitop and time monday thurday wednesday
(integer) 12500001
127.0.0.1:6379>
優點:1、節約空間,一億人每天的登入情況,用一億bit,約1200WByte,約10M的字元就能表示 2、計算方便
優點:1、節約空間,一億人每天的登入情況,用一億bit,約1200WByte,約10M的字元就能表示 2、計算方便