日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

基于TairHash實(shí)現(xiàn)用戶多設(shè)備登錄管理

更新時(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)單又高效。

圖 1. 用戶多設(shè)備登錄管理示意圖用戶多設(shè)備登錄管理示意圖

代碼示例

本示例的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信息。