MySQL 系统学习 第六阶段:Redis + 缓存 + 高并发设计 第六章:Redis 实现登录 Token

一、为什么 JWT 还需要 Redis?

很多人认为:

JWT 是无状态的,不需要 Redis。

理论上没错。

JWT:

复制代码
复制代码
用户信息
+
签名

↓

Token

服务器收到 Token 后:

复制代码
复制代码
验证签名

↓

解析用户信息

不需要查询数据库。


但是企业中仍然经常结合 Redis。

原因:

JWT 本身无法主动失效。

例如:

用户登录:

复制代码
复制代码
Token 有效期 7 天

第二天:

用户退出登录。

但是:

这个 Token 仍然有效。

因为服务器不知道用户退出了。


所以加入 Redis:

复制代码
复制代码
Token

↓

Redis

↓

控制有效状态

二、登录流程(企业方案)

流程:

复制代码
复制代码
用户登录

↓

验证用户名密码

↓

生成 JWT

↓

保存 Token 到 Redis

↓

返回 Token

例如:

Redis:

复制代码
复制代码
key:

token:user:1001


value:

jwt_xxxxx


TTL:

7200秒

三、请求验证流程

用户请求接口:

复制代码
复制代码
请求 Header

Authorization:

Bearer token

服务器:

第一步:

验证 JWT:

复制代码
复制代码
Token是否合法

第二步:

查询 Redis:

复制代码
复制代码
token:user:1001

存在:

继续访问。

不存在:

返回:

复制代码
复制代码
登录失效

四、退出登录如何实现?

JWT 最大问题:

无法主动删除。

Redis 解决:

退出:

复制代码
复制代码
删除 Redis 中 Token

流程:

复制代码
复制代码
用户点击退出

↓

删除 Redis Token

↓

Token立即失效

例如:

删除:

复制代码
复制代码
DEL token:user:1001

之后:

用户再次请求:

复制代码
复制代码
JWT验证通过

↓

Redis没有Token

↓

拒绝访问

五、Token 黑名单

场景:

管理员强制下线用户。

例如:

发现账号异常。

需要:

立即让 Token 失效。

方案:

建立黑名单:

Redis:

复制代码
复制代码
blacklist:token_xxx

value:

1

TTL:

剩余有效时间

请求:

复制代码
复制代码
检查Token

↓

是否在黑名单

↓

存在

↓

拒绝

六、单点登录(SSO)

什么是单点登录?

一个账号:

只能登录一个设备。

例如:

电脑登录:

复制代码
复制代码
Token A

手机登录:

复制代码
复制代码
Token B

新的登录:

删除旧 Token。

Redis:

复制代码
复制代码
user:1001:token

↓

Token B

旧 Token:

自动失效。


七、多端登录

有些系统允许:

电脑:

复制代码
复制代码
Token A

手机:

复制代码
复制代码
Token B

平板:

复制代码
复制代码
Token C

Redis:

使用 Set:

复制代码
复制代码
user:1001:tokens

TokenA

TokenB

TokenC

八、Redis Key 设计

企业常见:

保存登录 Token

复制代码
复制代码
token: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_id=1001;

问题:

  • 数据库压力大
  • 查询慢
  • 高并发性能差

Redis:

复制代码
复制代码
GET token:user:1001

速度更快。


十一、企业登录架构

复制代码
复制代码
              用户登录

                 ↓

             NestJS

                 ↓

        用户名密码验证

                 ↓

             生成 JWT

                 ↓

              Redis

        保存 Token 状态

                 ↓

             返回客户端

请求:

复制代码
复制代码
客户端

 ↓

JWT

 ↓

Redis验证

 ↓

业务接口

十二、本章总结

功能 Redis作用
保存 Token 管理登录状态
退出登录 删除 Token
强制下线 Token 黑名单
单点登录 保存当前 Token
多端登录 保存多个 Token
续期 刷新 TTL

本章一句话总结

JWT 负责身份认证,Redis 负责控制 Token 的有效状态,二者结合才能实现企业级登录管理。


思考题(精简回答)

  1. JWT 已经包含用户信息,为什么企业还需要 Redis?
    因为 JWT 本身无法主动失效。Redis 可以管理 Token 状态,实现:退出登录、强制下线、Token过期控制

  2. 用户退出登录时,为什么不能直接删除 JWT? 因为 JWT 保存在客户端,服务器无法直接删除。只能通过 Redis 删除 Token 状态,让该 Token 失效。

  3. Redis 保存 Token 的 Key 应该如何设计?
    推荐使用业务前缀:token:user:{userId}

  4. 什么是 Token 黑名单?它解决什么问题?
    Token 黑名单是保存已经失效 Token 的列表。用于解决:强制用户下线、Token泄露后立即失效问题

  5. 单点登录和多端登录在 Redis 中存储方式有什么区别?
    单点登录:一个用户只保存一个 Token。新登录覆盖旧 Token。
    多点登录:一个用户保存多个 Token。通常使用 Set。

  6. 为什么 Token 状态适合存 Redis,而不是 MySQL?
    因为 Token 查询频繁,需要高速访问。

相关推荐
2301_802651081 小时前
imx6ull裸机开发:UART
学习
默 语2 小时前
Java新手入门:从零开始安装JDK并配置环境变量
java·开发语言·python·mysql·group by·1024程序员节·数据去重
辣知2 小时前
辣知·化智56 良渚神权与夏朝颠覆
学习
dadaobusi2 小时前
学习:三层交换机
学习
用户3074596982073 小时前
MySQL EXPLAIN 零基础完全精通指南:从"看不懂"到"会优化"
mysql
笨鸟先飞的橘猫3 小时前
树结构在游戏行业中的应用
学习·游戏
这个DBA有点耶3 小时前
自增主键用尽了怎么办?INT溢出、在线迁移与预防策略全解析
数据库·mysql·代码规范
迷茫的大专生3 小时前
高可用总结
redis·mysql·nginx·高可用
yangmu32034 小时前
从显像管到Micro-LED:屏幕的光之进化
学习·显示器
半生过往4 小时前
前端工程师学习智能体开发(一)
前端·学习·状态模式