1. 程式人生 > >redis點陣圖法統計活躍使用者

redis點陣圖法統計活躍使用者

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、計算方便