用redis統計大量用戶的登陸情況[只判斷是否活躍]


有這樣的一個場景需求:有上億的用戶,要統計這批用戶的登陸情況,例如一周連續登陸,連續三天是是否登陸,一周活躍天數等用戶

存在的挑戰

  1. 數據如何盡可能用小的空間存儲
  2. 如何能快速獲取指定的數據

如果使用文件保存

   會有如下問題:

  1. 文件分割變得十分麻煩

  2. 數據檢索非常不方便

  3. 用戶關聯操作復雜

如果使用數據庫表

   會有如下問題:

  1. 占用空間增長速度快,表急劇增大
  2. 使用索引,易產生碎片,每次插入數據還要維護索引,影響性能
  3. 要用group ,sum等運算,計算較慢

使用redis位圖進行存儲(setbit/getbit)

   優點:

  1. 由於我的業務中只需要根據某個用戶id查詢是否是活躍用戶,不存在復雜的查詢條件,所以用redis很合適。
  2. redis中所有數據都是二進制形式存儲的。redis支持一個setbit和getbit操作,它支持在某個key的value上直接對某個二進制位操作,每個二進制位都只有0和1兩種狀態,正好可以表示用戶是否活躍兩種狀態。
  3. 存取速度非常快

思路

  1. 記錄用戶登陸:每天按日期生成一個位圖, 用戶登陸后,把user_id位上的bit值置為1
  2. 把1周的位圖用 and 計算, 是否連續登陸用and計算,得到1即為連續登陸的用戶,簡單來說,能快速的拿到用戶是否登陸的0/1狀態,就能快速的計算出某段日期內登陸了幾天
  3. 如果每次執行redis比較繁瑣,可以簡單的生成追加文件的方式,追加redis命令,例setbit到文件中,隔一段時間統一利用pipe mode通過管道的方式直接快速存入redis

命令

redis 127.0.0.1:6379> setbit mon 3 1

(integer) 0

redis 127.0.0.1:6379> setbit mon 5 1

(integer) 0

redis 127.0.0.1:6379> setbit mon 7 1

(integer) 0

redis 127.0.0.1:6379> setbit thur 100000000 0

(integer) 0

redis 127.0.0.1:6379> setbit thur 3 1

(integer) 0

redis 127.0.0.1:6379> setbit thur 5 1

(integer) 0

redis 127.0.0.1:6379> setbit thur 8 1

(integer) 0

127.0.0.1:6379> getbit thur 8
(integer) 1

高效插入舉例

  1. 新建一個文本文件,包含redis命令

*4    # 表示下面的命令有四個參數
$6   #第一個參數的長度
setbit   # 參數值
$3       #第二個參數的長度
mon    # 參數值
$1  #第三個參數的長度
3    # 參數值
$1  #第四個參數的長度
1   # 參數值

    存於data.txt

   2. 利用管道插入

   cat data.txt | redis-cli --pipe

可參考學習:http://blog.csdn.net/lglgsy456/article/details/39394961


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM