TairHash支援為Field設定到期時間和版本,提高了Hash資料結構的靈活性,簡化了複雜情境下的業務開發工作。
背景資訊
您可基於Redis String輕鬆實現使用者單裝置登入管理,但對於使用者多裝置登入管理情境,基於String實現則需要將使用者ID與裝置類型進行字元拼接,例如User_1_phone
。該方案會存在如下問題:
業務開發:需進行額外拼接工作,增加開發工作量。
程式:增加重複的編、解碼工作。
資料庫儲存:增加大量重複的使用者名稱首碼,浪費儲存空間。
本樣本介紹使用Tair自研的拓展資料結構TairHash,實現使用者多裝置登入管理。TairHash不僅支援Key層級的到期設定,同時還支援Field層級的到期操作。可以將使用者ID設定為Key、將裝置類型設定為Field、將使用者Token設定為Value,同時可對Field設定到期時間,簡單又高效。
程式碼範例
本樣本的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資訊。