全部產品
Search
文件中心

Tair (Redis® OSS-Compatible):基於TairHash實現使用者多裝置登入管理

更新時間:Jul 03, 2024

TairHash支援為Field設定到期時間和版本,提高了Hash資料結構的靈活性,簡化了複雜情境下的業務開發工作。

背景資訊

您可基於Redis String輕鬆實現使用者單裝置登入管理,但對於使用者多裝置登入管理情境,基於String實現則需要將使用者ID與裝置類型進行字元拼接,例如User_1_phone。該方案會存在如下問題:

  • 業務開發:需進行額外拼接工作,增加開發工作量。

  • 程式:增加重複的編、解碼工作。

  • 資料庫儲存:增加大量重複的使用者名稱首碼,浪費儲存空間。

本樣本介紹使用Tair自研的拓展資料結構TairHash,實現使用者多裝置登入管理。TairHash不僅支援Key層級的到期設定,同時還支援Field層級的到期操作。可以將使用者ID設定為Key、將裝置類型設定為Field、將使用者Token設定為Value,同時可對Field設定到期時間,簡單又高效。

圖 1. 使用者多裝置登入管理示意圖使用者多裝置登入管理示意圖

程式碼範例

本樣本的Python版本為3.8,且已安裝Tair-py依賴,Tair-py的快捷安裝命令為:pip3 install tair

# -*- coding: utf-8 -*-
#!/usr/bin/env python
import time
from tair import Tair
from tair import ResponseError


def get_tair() -> Tair:
    """
    該方法用於串連Tair執行個體。
    * host:Tair執行個體串連地址。
    * port:Tair執行個體的連接埠號碼,預設為6379。
    * username:Tair執行個體的賬戶,可不填,使用預設帳號登入。
    * password:Tair執行個體的密碼。
    """
    tair: Tair = Tair(
        host = "r-bp************.redis.rds.aliyuncs.com",
        port = 6379,
        db = 0,
        username = "",
        password = "D****123",
    )
    return tair


def add_user_pass(userID: str, device: str, token: str, timeout: int) -> bool:
    """
    該方法為通過EXHSET命令,將使用者登入資訊存入TairHash資料結構中。
    * 將使用者ID(userID)設定為Key。
    * 將裝置類型(device)設定為Field。
    * 將使用者Token(token)設定為Value。
    * 將使用者Token的到期時間設定為Ex。
    """
    try:
        tair = get_tair()
        ret = tair.exhset(userID, device, token, ex=timeout)
        return ret == 1
    except ResponseError as e:
        print(e)
        return False


def print_up(userID):
    """
    該方法列印未到期的使用者Token資訊。
    """
    for i in tair.exhgetall(userID):
        print('{}:{}'.format (userID,i))


if __name__ == "__main__":
    tair = get_tair()
    # 添加user1、user2測試資料。
    user_1 = "user1"
    user_2 = "user2"
    add_user_pass(user_1, "phone", "token_123", 5)
    add_user_pass(user_1, "pad", "token_124", 10)
    add_user_pass(user_2, "pad", "token_456", 10)
    add_user_pass(user_2, "pc", "token_457", 10)
    # 等待6s。
    print("Wait 6 seconds")
    time.sleep(6)
    # 列印此時未到期的使用者Token資訊。
    print_up(user_1)
    print_up(user_2)
            

本樣本的正確執行結果如下:

Wait 6 seconds
user1:{field: pad, value: token_124}
user2:{field: pad, value: token_456}
user2:{field: pc, value: token_457}

結果說明:共計寫入了4條使用者Token資訊,但第一條資料的到期時間為5s,所以在寫入資料的6s後僅剩3條未到期使用者Token資訊。