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信息。