基于TairHash實(shí)現(xiàn)用戶多設(shè)備登錄管理
TairHash支持為Field設(shè)置過(guò)期時(shí)間和版本,提高了Hash數(shù)據(jù)結(jié)構(gòu)的靈活性,簡(jiǎn)化了復(fù)雜場(chǎng)景下的業(yè)務(wù)開(kāi)發(fā)工作。
背景信息
您可基于Redis String輕松實(shí)現(xiàn)用戶單設(shè)備登錄管理,但對(duì)于用戶多設(shè)備登錄管理場(chǎng)景,基于String實(shí)現(xiàn)則需要將用戶ID與設(shè)備類型進(jìn)行字符拼接,例如User_1_phone
。該方案會(huì)存在如下問(wèn)題:
業(yè)務(wù)開(kāi)發(fā):需進(jìn)行額外拼接工作,增加開(kāi)發(fā)工作量。
程序:增加重復(fù)的編、解碼工作。
數(shù)據(jù)庫(kù)存儲(chǔ):增加大量重復(fù)的用戶名前綴,浪費(fèi)存儲(chǔ)空間。
本示例介紹使用Tair自研的拓展數(shù)據(jù)結(jié)構(gòu)TairHash,實(shí)現(xiàn)用戶多設(shè)備登錄管理。TairHash不僅支持Key級(jí)別的過(guò)期設(shè)置,同時(shí)還支持Field級(jí)別的過(guò)期操作。可以將用戶ID設(shè)置為Key、將設(shè)備類型設(shè)置為Field、將用戶Token設(shè)置為Value,同時(shí)可對(duì)Field設(shè)置過(guò)期時(shí)間,簡(jiǎn)單又高效。
代碼示例
本示例的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實(shí)例。
* host:Tair實(shí)例連接地址。
* port:Tair實(shí)例的端口號(hào),默認(rèn)為6379。
* username:Tair實(shí)例的賬戶,可不填,使用默認(rèn)賬號(hào)登錄。
* password:Tair實(shí)例的密碼。
"""
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:
"""
該方法為通過(guò)EXHSET命令,將用戶登錄信息存入TairHash數(shù)據(jù)結(jié)構(gòu)中。
* 將用戶ID(userID)設(shè)置為Key。
* 將設(shè)備類型(device)設(shè)置為Field。
* 將用戶Token(token)設(shè)置為Value。
* 將用戶Token的過(guò)期時(shí)間設(shè)置為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):
"""
該方法打印未過(guò)期的用戶Token信息。
"""
for i in tair.exhgetall(userID):
print('{}:{}'.format (userID,i))
if __name__ == "__main__":
tair = get_tair()
# 添加user1、user2測(cè)試數(shù)據(jù)。
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)
# 打印此時(shí)未過(guò)期的用戶Token信息。
print_up(user_1)
print_up(user_2)
本示例的正確執(zhí)行結(jié)果如下:
Wait 6 seconds
user1:{field: pad, value: token_124}
user2:{field: pad, value: token_456}
user2:{field: pc, value: token_457}
結(jié)果說(shuō)明:共計(jì)寫(xiě)入了4條用戶Token信息,但第一條數(shù)據(jù)的過(guò)期時(shí)間為5s,所以在寫(xiě)入數(shù)據(jù)的6s后僅剩3條未過(guò)期用戶Token信息。