需求
需支持多终端系统的登陆 有商家后台、运营后台、用户app
单点登陆
主动退出 清理token
定时过期
在token未过期时 账号基本信息变更时需及时更新token中的数据
实现
考虑到能通过userid反查redis中的token 并对token value值更新 需要考虑使用keys来匹配查找,但是听说keys性能不是非常好
对于keys命令的性能情况 建议看下这两位大佬的文章
Redis5.0改进了keys算法吗?python redis的scan_iter性能真的很差!
https://zhuanlan.zhihu.com/p/150790074
那么对我来说 我可能希望用内存换区性能 单独给token增加索引 做一个映射方便快速查找 具体方式如下
设置一个用户的token 【用于登陆、单点登陆判断】
//设置指定用户token的映射key
set userapp:userid:11:token userapp:token:d4s6f4asd6f4a6sd5f4a65sdf
//设置过期时间
expire userapp:userid:11:token 1000
//设置token中存储的用户基础数据
set userapp:token:d4s6f4asd6f4a6sd5f4a65sdf
//设置过期时间
expire userapp:userid:11:token 1000
在设置指定用户token的映射key中 参数含义为
参数1 userapp为应用名 userid:11:token表示用户id为11的token
参数2 userapp:token:d4s6f4asd6f4a6sd5f4a65sdf 表示为 userapp的token为d4s6f4asd6f4a6sd5f4a65sdf
当然以上名称可以自定义 只是我个人觉得怕重复导致键值被覆盖 也不一定需要用冒号分隔
那么以上就设置好了第一步 毕竟后期通过userid就可以实现查找token 例如方式如下
获取用户token名和获取token下的数据【用于校验登陆或修改更新数据或主动退出】
//获取token名
get userapp:userid:11:token
//通过获取的token名【获取】用户数据
get userapp:token:d4s6f4asd6f4a6sd5f4a65sdf
//通过获取的token名【更新】用户数据
set userapp:token:d4s6f4asd6f4a6sd5f4a65sdf 用户基础数据
//删除多个key 用于主动退出
del userapp:userid:11:token userapp:token:d4s6f4asd6f4a6sd5f4a65sdf
获取结果如下
总结
对于内存紧张的 考虑keys也行 听说redis5 redis6有进行优化 如果用的话 建议自己实际测试下
对于觉得执行多条redis命令消耗太大 那么可考虑结果lua脚本封装成特定功能的函数 并hash方式执行lua脚本减少通信过程的损耗
需支持多终端系统的登陆 有商家后台、运营后台、用户app?
通过设置key名拼接前缀 避免多系统使用时发生冲突
单点登陆?
//检测指定key是否存在
exists userapp:userid:11:token
//存在就清理过期token
get userapp:userid:11:token
del userapp:token:d4s6f4asd6f4a6sd5f4a65sdf
//再次走 用户登录即可 或者 直接走不清理 毕竟也会自动过期 只是不清理占用这内存
主动退出 清理token?
获取后到token名直接del 用户token索引和token即可
定时过期?
务必设置key的过期时间
在token未过期时 账号基本信息变更时需及时更新token中的数据 ?
获取到token名称 再进行set即可更新该token里的值即可