使用Redis記錄用戶在線狀態

哈希表(HashTable)是一種數據結構,它實現了「鍵-值」(Key-Value)的映射。根據Key就能快速找到Value 。而且,不管有多少個鍵值對,查詢時間始終不變。Python的字典就是基於哈希表實現的。
    在Redis中也有一個數據結構叫做哈希表。
    在Redis中,使用哈希表能夠保存大量數據,且不管有多少數據,查詢時間始終保持不變。
    Redis的一個哈希表裏面能夠儲存2的32次方減1(約等於43億)個鍵值對。數據結構


如今, 一些論壇網站可以顯示用戶當前是在線狀態仍是離線狀態。那這個功能是怎麼實現的呢?其中一種實現方法就是基於Redis來實現ide

    程序的邏輯很是簡單,包括如下幾個步驟:
        (1).用戶登陸時,在Redis中添加一個字符串, Key爲用戶帳號, Value爲1 。
        (2).用戶退出網站時,從Redis中刪除帳號名對應的Key 。
        (3).查詢時,程序嘗試從Redis中獲取用戶帳號對應的字符串:若是值爲1 ,則表示「在線";若是值爲None,則表示「不在線」。優化


分別使用字符串和哈希表記錄用戶的在線信息, 井比較在這個場景下哈希表相對於字符串有什麼優點?網站

    若是有1000個用戶同時在線,則Redis列出全部Key後的結果如圖:spa

        圖片.png

    如今,網站又加入了一個積分機制。每一個用戶都有一個積分數據,因爲這個數據須要常常查詢和修改,所以也使用Redis來保存圖片

    那問題來了, 在線信息使用用戶帳號做爲Key, 積分信息也使用帳號做爲Key,這不就衝突了嗎?
    因而有人給不一樣的Key加上了後綴。例如,記錄用戶是否在線,使用的Key爲「帳號:online」。若是用戶帳號爲10032,那他的在線狀態Key就是「10032:online」 。記錄用戶積分的Key爲「帳號:score」,例如用戶10032對應的積分Key爲「10032:score」內存

    注意:在Redis中, Key 中的冒號就是普通的字符,用來分割前綴和後綴,沒有什麼特殊意義。寫成「10032_online」或者「10032-score」效果徹底同樣字符串

    使用hash存儲的代碼示例:
hash

        圖片.png

        圖片.png

        • 第12行代碼:向Redis中名爲user_online_status的哈希表中添加一個字段, 字段名爲用戶帳號,值爲l 。若是不存在名爲user_online_status的哈希表, 則自動建立一個。
        • 第21行代碼:從Redis中名爲user online status 的晗希表中刪除一個字段,宇段名爲用戶帳號。
        • 第30行代碼:檢查名爲user_online_status的哈希表中是否有某個特定的宇段, 若是沒有這個字段就返回False,若是有這個字段就返回True。
it

        圖片.png

    使用晗希表不只能夠減小Redis 的個數, 還能優化儲存空間。Red is 官方就特別說明,哈希表對存儲結構進行過特殊的優化,儲存相同的內容,佔用的內存比字符串要小不少。

相關文章
相關標籤/搜索