2014-02-19 71 views
4

我想跟蹤有多少用戶在線,我使用Redis來解決此問題,因爲一個或多個應用程序實例訪問此緩存以顯示狀態。在每次新登錄時,Redis都會使用用戶標識更新,密鑰「online_users」,並在每次登出時刪除用戶。這種方法是否正確,如果不是如何構建這個以獲得最佳性能,還有一些大數據集?使用Redis跟蹤在線用戶

"online_users" -> { 
    user_s23,user_1f3,user_1mn,user_xd3 
} 

用戶信息在緩存中可用,是否將狀態作爲另一個屬性包含在內?

user_s23 { 
name, id, profile_pic, type, etc, status:active/inactive 
} 

儘管這個2 approaches for tracking online users with Redis. Which one is faster?問題的答案就比較這兩種方法,提到的第一個鏈接不可用,所以我無法理解的其他方面。

回答

9

如果你只是想知道:

1 - 有多少用戶在線

2-什麼用戶是否在線

3-如果給定用戶在線查找

而且您可以確保您可以跟蹤EVERY註銷和所有用戶呼叫註銷請求,然後您可以使用set並存儲用戶id我當用戶登錄並在用戶註銷時刪除用戶標識(與您所描述的方法相同)時,將其添加到該用戶標識中。

實例:

> SADD online_users USER_A

(整數)1

  • USER_B日誌中:在

    • USER_A日誌

    > SADD online_users USER_B

    (整數)1

    • 有多少用戶是否在線?

    > SCARD online_users

    (整數)2

    • 是USER_A在線?

    > sismember online_users USER_A

    (整數)1

    • USER_A註銷:

    >斯雷姆online_users USER_A

    (整數)1

    • 用戶是否在線呢?

    > smembers online_users

    1) 「USER_B」

    所有這些操作都是O(1)除smembers是O(N),你唯一的關注和限制是用於存儲這些數據的內存。一個提示是嘗試爲用戶使用較小的密鑰,如果不能,Redis已經壓縮了它們。

    如果您無法確保您會跟蹤註銷,那麼您可以使用問題的第二種方法「使用Redis跟蹤在線用戶的兩種方法,哪種方法更快?」。

    要使用此方法,您需要跟蹤用戶的所有事件(不僅僅是登錄),並使用時間戳將用戶標識存儲在不同的鍵上,如:online_users_2014-02-20_10-01(在線用戶於2014年2月20日10:01)。

    要回答當前有多少用戶在線,可以說,例如,如果用戶在最近3分鐘內發送了至少一個事件,則認爲該用戶是在線的。然後計算最後3組的聯合,並在結果集上使用scard來查找有多少用戶在線。

    這種方法要貴得多,因爲sunion是O(N)。在您的密鑰上添加超時(使用expire命令)以保持幫助清理您的內存是個好主意。

    基於最後一種方法的另一種方法是在客戶端添加一些邏輯,在後臺爲後端每分鐘發送一次PING事件,然後您可以跟蹤此事件,並確保用戶在該集合在線。

+0

這種方法是一個很好的方法,我將實施這種方法並以大批量測試性能。 –

3

1)

在使用性能和存儲器方面,我認爲最好的辦法是使用一個bitset結構,以這種方式,每個用戶被表示爲單個比特和Redis的擁有大量的命令(setbit, bitcount,bitop,getbit)來處理這個結構。

使用此方法的唯一要求是您需要爲每個用戶提供唯一的順序ID。

實施例:

1 - 用戶43名登錄在

> setbit online_users 43 1

(整數)0

2 - 用戶57名登錄在

> setb它online_users 57 1

(整數)0

3 - 總用戶在線

>比特計數online_users

(整數)2

4 - 用戶43註銷

> setbit online_users 43 0

(整數)1

5 - 總計用戶在線

>比特計數online_users

(整數)1

6 - 檢查用戶57是否在線

> GETBIT online_users 57

(整數)1

2)它是確定建立一個新的屬性到您的用戶結構來跟蹤用戶的狀態,但也許更容易直接檢查online_users位集的值(使用getbit命令)。

3)第一連桿的高速緩存版本,可以發現here

在存儲器和性能方面,採用一個bitset比其它問題的approches更好。

順便說一下,我不會使用使用KEYS命令的方法,因爲它可能是數據集很大時的瓶頸。

您可以在BITCOUNT Redis命令的文檔頁面上找到關於此方法的信息。

+0

你已經規定的方法是好的,但我只有用戶的文本ID,而不是數字。所以,setbit online_users xxxx123 1拋出錯誤。更多的是,我如何在網上找到用戶列表? –

+0

您確實需要爲每個用戶使用此方法具有唯一的順序ID。 – fgasparini

+0

您確實需要爲每個用戶使用此方法具有唯一的順序ID,並且確定在線用戶列表的開銷很大,但檢查給定用戶是否在線很容易。 在你的問題中,你說過你想跟蹤有多少用戶在線,但我會張貼另一個解決方案,讓你跟蹤在線用戶。 – fgasparini