一个账号,多台设备同时登陆的问题,设计以及实现
参考这篇文章:
https://www.alibabacloud.com/help/zh/tair/use-cases/manage-multi-device-logon-from-a-single-user-by-using-tairhash
1.0 设计思路
利用的是Redis,主设备的保存问题,可使用MySQL进行设置实现
同时允许3台设备在线
只是设计思路,数据库的使用,可以按照公司的要求
多设备
Redis实现的设计
参考
云原生内存数据库设计
Tair自研的拓展数据结构TairHash,实现用户多设备登录管理。TairHash不仅支持Key级别的过期设置,同时还支持Field级别的过期操作。可以将用户ID设置为Key、将设备类型设置为Field、将用户Token设置为Value,同时可对Field设置过期时间,简单又高效。
2.0 基于tair 实现
安装依赖
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)