美文网首页
每日一面 - 限制用户设备

每日一面 - 限制用户设备

作者: 干货满满张哈希 | 来源:发表于2021-01-16 08:32 被阅读0次

    问题参考自:https://www.zhihu.com/question/439438146 ,答案为个人原创

    用户登录,保存30天的免登,只允许两个设备登录,如果有第三个设备登录,踢掉第一个。改密码的时候,所有设备需要下线。这个逻辑怎么实现呢?

    使用 Redis 存储用户 ,登录的设备实现,利用 ZSET。

    存储结构如下:

    image

    每个用户一个 ZSET(假设就是以用户 id 作为 ZSET 的 KEY),里面的 KEY 为设备 id,value 为登录时间戳。

    当用户登录时,使用 lua 脚本(防止并发导致登录设备多于 2 个)检查设备:

    ZSCORE 判断设备是否存在以及登录时间
    如果存在:
      ZADD就更新SCORE为当前时间戳
    如果不存在:
      ZCARD 用户id 获取当前用户有多少设备
      如果设备数量 >= 2 则移除除了最后一个的其他设备(可以通过ZRANGE获取最后一个KEY,ZSCORE获取其分数之后ZREMRANGEBYSCORE删除小于这个分数的所有KEY)
      ZADD设置设备id为KEY,当前时间戳为SCORE
    设置ZSET过期时间为30天,减少30天内没有设备登录时检查登录态的判断消耗
    

    当用户请求需要登录态后的 API,检查登录态时:

    ZSCORE 判断设备是否存在以及登录时间
    如果设备存在存在并且登录时间与当前时间间隔小于30天,则有效。
    否则,登录态失效,需要重新登录
    

    修改密码,所有设备下线:

    删除这个ZSET
    

    相关文章

      网友评论

          本文标题:每日一面 - 限制用户设备

          本文链接:https://www.haomeiwen.com/subject/fnagaktx.html