MySQL 系统学习 第六阶段:Redis + 缓存 + 高并发设计 第六章:Redis 实现登录 Token 一、为什么 JWT 还需要 Redis很多人认为JWT 是无状态的不需要 Redis。理论上没错。JWT用户信息 签名 ↓ Token服务器收到 Token 后验证签名 ↓ 解析用户信息不需要查询数据库。但是企业中仍然经常结合 Redis。原因JWT 本身无法主动失效。例如用户登录Token 有效期 7 天第二天用户退出登录。但是这个 Token 仍然有效。因为服务器不知道用户退出了。所以加入 RedisToken ↓ Redis ↓ 控制有效状态二、登录流程企业方案流程用户登录 ↓ 验证用户名密码 ↓ 生成 JWT ↓ 保存 Token 到 Redis ↓ 返回 Token例如Rediskey: token:user:1001 value: jwt_xxxxx TTL: 7200秒三、请求验证流程用户请求接口请求 Header Authorization: Bearer token服务器第一步验证 JWTToken是否合法第二步查询 Redistoken:user:1001存在继续访问。不存在返回登录失效四、退出登录如何实现JWT 最大问题无法主动删除。Redis 解决退出删除 Redis 中 Token流程用户点击退出 ↓ 删除 Redis Token ↓ Token立即失效例如删除DEL token:user:1001之后用户再次请求JWT验证通过 ↓ Redis没有Token ↓ 拒绝访问五、Token 黑名单场景管理员强制下线用户。例如发现账号异常。需要立即让 Token 失效。方案建立黑名单Redisblacklist:token_xxx value: 1 TTL: 剩余有效时间请求检查Token ↓ 是否在黑名单 ↓ 存在 ↓ 拒绝六、单点登录SSO什么是单点登录一个账号只能登录一个设备。例如电脑登录Token A手机登录Token B新的登录删除旧 Token。Redisuser:1001:token ↓ Token B旧 Token自动失效。七、多端登录有些系统允许电脑Token A手机Token B平板Token CRedis使用 Setuser:1001:tokens TokenA TokenB TokenC八、Redis Key 设计企业常见保存登录 Tokentoken:user:{userId}例如token:user:1001保存登录设备user:session:{userId}Token 黑名单token:blacklist:{token}九、Token 续期例如Token有效期2小时。用户持续操作自动续期。流程用户请求 ↓ 刷新 Redis TTL ↓ 继续保持登录例如EXPIRE token:user:1001 7200十、为什么不用数据库保存 Token如果每次请求查询SELECT token FROM user_token WHERE user_id1001;问题数据库压力大查询慢高并发性能差RedisGET token:user:1001速度更快。十一、企业登录架构用户登录 ↓ NestJS ↓ 用户名密码验证 ↓ 生成 JWT ↓ Redis 保存 Token 状态 ↓ 返回客户端请求客户端 ↓ JWT ↓ Redis验证 ↓ 业务接口十二、本章总结功能Redis作用保存 Token管理登录状态退出登录删除 Token强制下线Token 黑名单单点登录保存当前 Token多端登录保存多个 Token续期刷新 TTL本章一句话总结JWT 负责身份认证Redis 负责控制 Token 的有效状态二者结合才能实现企业级登录管理。思考题精简回答JWT 已经包含用户信息为什么企业还需要 Redis因为 JWT 本身无法主动失效。Redis 可以管理 Token 状态实现退出登录、强制下线、Token过期控制用户退出登录时为什么不能直接删除 JWT因为 JWT 保存在客户端服务器无法直接删除。只能通过 Redis 删除 Token 状态让该 Token 失效。Redis 保存 Token 的 Key 应该如何设计推荐使用业务前缀token:user:{userId}什么是 Token 黑名单它解决什么问题Token 黑名单是保存已经失效 Token 的列表。用于解决强制用户下线、Token泄露后立即失效问题单点登录和多端登录在 Redis 中存储方式有什么区别单点登录一个用户只保存一个 Token。新登录覆盖旧 Token。多点登录一个用户保存多个 Token。通常使用 Set。为什么 Token 状态适合存 Redis而不是 MySQL因为 Token 查询频繁需要高速访问。