• python后端,一个账户,多设备登录管理


    一个账号,多台设备同时登陆的问题,设计以及实现
    参考这篇文章:

    https://www.alibabacloud.com/help/zh/tair/use-cases/manage-multi-device-logon-from-a-single-user-by-using-tairhash
    
    • 1

    1.0 设计思路

    利用的是Redis,主设备的保存问题,可使用MySQL进行设置实现
    同时允许3台设备在线

    只是设计思路,数据库的使用,可以按照公司的要求
    多设备
    Redis实现的设计
    在这里插入图片描述
    参考
    云原生内存数据库设计
    在这里插入图片描述

    Tair自研的拓展数据结构TairHash,实现用户多设备登录管理。TairHash不仅支持Key级别的过期设置,同时还支持Field级别的过期操作。可以将用户ID设置为Key、将设备类型设置为Field、将用户Token设置为Value,同时可对Field设置过期时间,简单又高效。

    2.0 基于tair 实现

    安装依赖

    pip3 install tair
    
    • 1

    代码

    # -*- 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)
                
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66

    3.0 基于Redis的实现(配合自己公司的框架)

  • 相关阅读:
    如何使用nginx部署https网站(亲测可行)
    Android源码设计模式探索与实战【代理模式】
    【SpringBoot笔记14】SpringBoot框架之RestTemplate对象及其常用方法
    CCES软件做开发,如果仿真器连不进目标板怎么解决?(Failed to connect to processor)
    自学数据库-MySQL
    黑客入狱知识点总结
    Markdown常用快捷键
    Java Integer.toHexString()具有什么功能呢?
    安装 hbase(伪分布式)
    Map的遍历和Map的有序和无序
  • 原文地址:https://blog.csdn.net/xiameimei_win/article/details/132620570