问题参考自: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
网友评论