すべてのプロダクト
Search
ドキュメントセンター

Tair (Redis® OSS-Compatible):TairHashを使用して、単一ユーザーからのマルチデバイスログオンを管理する

最終更新日:Sep 12, 2024

TairHashは、フィールドの有効期間 (TTL) とバージョン番号を指定できるデータ構造です。 TairHashはより柔軟に使用でき、アプリケーション開発を簡素化します。

背景情報

Redis文字列を使用すると、単一のデバイスからのユーザーログインを簡単に管理できます。 ただし、単一ユーザーからのマルチデバイスログオンの場合、Redis文字列にはユーザーIDとデバイスタイプの文字列を連結する必要があります。 例: User_1_phone このソリューションには、次の欠点があります。

  • アプリケーション開発: 文字列の連結には余分なワークロードが必要です。

  • プログラミング: エンコードとデコードの繰り返しが必要です。

  • ストレージ: ユーザーIDのプレフィックスが重複すると、ストレージスペースが無駄になります。

このトピックでは、TairHashを使用して単一ユーザーからのマルチデバイスログオンを管理する方法について説明します。 TairHashは、Tairの社内拡張データ構造です。 TairHashでは、キーとフィールドの両方のTTL設定を構成できます。 この場合、キーをユーザーIDに、フィールドをデバイスタイプに、値をユーザートークンに設定できます。 フィールドにTTLを指定することもできます。

図1. Redis文字列とTairHashの比較 Comparison between Redis strings and TairHash

サンプルコード

この例では、Python 3.8が使用され、Tair-pyがインストールされています。 pip3 install tairコマンドを実行してTair-pyをインストールできます。

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


def get_tair() -> Tair:
    """
    This method is used to connect to a Tair instance. 
    * host: the endpoint that is used to connect to the Tair instance. 
    * port: the port number that is used to connect to the Tair instance. Default value: 6379. 
    * username: the username of a database account. If you do not specify this parameter, the default account is used. 
    * password: the password of the database account. 
    """
    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:
    """
    This method uses the EXHSET command to store user logon information in TairHash. 
    * Set key to the user ID. 
    * Set field to the device type. 
    * Set value to the user token. 
    * Set ex to the TTL of the user token. 
    """
    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):
    """
    This method is used to display the information of user tokens that have not expired. 
    """
    for i in tair.exhgetall(userID):
        print('{}:{}'.format (userID,i))


if __name__ == "__main__":
    tair = get_tair()
    # Add the test data of User 1 and User 2. 
    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)
    # Wait 6 seconds. 
    print("Wait 6 seconds")
    time.sleep(6)
    # Display the information of user tokens that have not expired. 
    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}

ただし、すべてのトークンが書き込まれてから6秒後に表示されるのは、3つのユーザートークンの情報だけです。 これは、最初のユーザートークンのTTLが5秒であるためです。