python后端,一个账户,多设备登录管理
一个账号,多台设备同时登陆的问题,设计以及实现 参考这篇文章:
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)