2020-08-26
发布日期:2021-05-18 08:42:37 浏览次数:10 分类:精选文章

本文共 1727 字,大约阅读时间需要 5 分钟。

引言

今天我在面试中遇到了一个技术难题,关于多台终端设备如何实现同一账号的互斥登录,同时支持手机和PC端同时在线。这让我意识到了多点登录的复杂性,并在查阅资料后找到了一个可行的解决方案。接下来我将详细记录我的思考过程和解决方案的设计细节。

问题描述

如何设计一个系统,使得同一个账号能够在多台移动终端和PC端设备上实现互斥登录,即同一个用户不能在两台设备上同时登录。同时,还要支持手机和PC端同时在线,不互相干扰的情况。这其实是一个典型的多点登录问题。

什么是多点登录?

多点登录的概念类似于微信的多终端登录功能。比如同一个QQ号,你可能在PC1上登录,之后又登录到PC2,这时候PC1会收到通知“您已在别处登录”。每一个终端只能保持一个实例登录,且后登录会踢出前一个会话。

单点登录的概念

与之对应的单点登录(SSO)是一种企业级的身份管理解决方案。通过SSO,用户只需登录一次,就能在多个互信应用系统中访问。此外,SSO通常与缓存和身份标签(如token或sessionID)结合使用,来提升用户体验和应用集成度。

多点登录的实现思路

为了实现多点登录的互斥功能,我们可以采用token机制结合缓存的方式。具体实现方式如下:


设计思路

  • 用户登录时传递终端类型

    用户在登录时,需要指定自己的终端类型,例如“移动端”或“PC端”。这有助于区分不同终端的登录状态。

  • 缓存划分策略

    • 在缓存中分为两部分存储用户信息:
      • 缓存A:根据token存储用户ID。
      • 缓存B:根据用户ID存储用户信息对象(userInfo),包括终端类型与对应的token。
    • 用户信息对象userInfo中需要一个终端类型映射表,记录每个终端类型对应的token。
  • 登录流程

    • 用户登录并验证账号,假设已经从数据中获取User对象。
      1. 生成新token。
        1. 从缓存B中根据用户ID获取userInfo:
          • 如果缓存B中没有 userInfo,表示用户第一次登录或返回。此时需要将User对象转换为userInfo并存入缓存B。
          • 如果缓存B中已经有 userInfo,说明用户已经登录过。
          1. 检查userInfo中的终端类型映射表:
            • 如果有对应的token:
              • 删除缓存A中的旧token对应的记录。
              • 更新token到映射表中,并将新token存入缓存A。
              • 将更新后的 userInfo 存入缓存B。
            • 如果没有对应的token:
              • 将新token存入映射表,并将新token存入缓存A。
              • 将更新后的 userInfo 存入缓存B。
            1. 将生成的新token返回给前端。
  • 退出登录流程

    • 从缓存B中获取 userInfo。
      1. 从映射表中获取对应的token。
        1. 删除缓存A中对应token的记录。
          1. 检查映射表:
            • 如果没有其他终端登录(映射表为空),则删除缓存B中的 userInfo。
            • 如果还有其他终端登录(映射表不为空),则保留缓存B中的 userInfo。

  • 优势分析

  • 保持高效的用户体验

    用户登录时,后台只需存储必要的token和用户信息,减少了数据库查询次数。

  • 支持多终端登录

    使用token机制,每个终端都有独立的登录状态,互不干扰。

  • 降低系统资源占用

    通过缓存A和缓存B的划分,确保了内存资源的合理利用,提升系统性能。

  • 灵活扩展性

    可以根据实际业务需求,扩展终端类型或调整缓存存储策略,满足不同场景的需求。


  • 实现中的注意事项

  • .token的存储方式

    token需要采用适当的加密方式,避免被篡改或伪造。

  • 缓存清除策略

    在退出登录时,要确保_cache_A和_cache_B中的数据被正确清除,防止残留数据导致的问题。

  • 终端类型的定义

    在实现时,需要明确终端类型的枚举值,例如:PC端、移动端等。同时要确保后台系统支持所有可能连接的终端类型。

  • 分布式环境的支持

    如果系统分布式运行,缓存机制需要考虑分布式锁和事务处理,避免数据不一致。


  • 总结

    通过以上方案,我们可以实现同一个账号在多台终端设备上的互斥登录,同时支持PC和手机端的同时在线。这一实现主要依赖于缓存技术和token机制,实现了高效的用户管理和资源利用。接下来,我将根据这个方案在后续工作中实施,并通过实际测试不断优化细节。

    上一篇:2020-08-27
    下一篇:基于php+swoole+shell 当服务器磁盘空间不足时,实现邮件报警的一种思路

    发表评论

    最新留言

    感谢大佬
    [***.8.128.20]2025年05月02日 22时48分50秒