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 查询频繁,需要高速访问。

相关推荐
渣渣灰飞1 小时前
MySQL 系统学习 第六阶段:Redis + 缓存 + 高并发设计 第五章:缓存穿透、缓存击穿、缓存雪崩
学习·mysql·缓存
你有我备注吗1 小时前
SQL学习之查询
java·sql·学习
从零开始的代码生活_2 小时前
C++ stack、queue 与 priority_queue:容器适配器原理与实战
开发语言·c++·后端·学习·算法
铅笔侠_小龙虾2 小时前
Rust 学习(6)-所有权规则、移动语义、Clone 与 Copy
python·学习·rust
kiss strong2 小时前
AI学习-langchain
学习·langchain
灵性(๑>ڡ<)☆2 小时前
Java学习笔记--面向对象高级(多态)
笔记·学习
AA陈超3 小时前
003 XiYou 西游 — P0 阶段实施计划
c++·笔记·学习·ue5
其实防守也摸鱼3 小时前
运维--安全与数据库
网络·数据库·学习·安全·安全威胁分析·数据库架构·软件安全
Rsun045513 小时前
MySQL 中什么是回表?
数据库·mysql