高并发下的 Token 存储策略: Redis 与 MySQL 的一致性

一、 背景:一个 Token 的两难境地

在微服务或前后端分离架构中,Access Token 是用户身份的唯一凭证。关于它的存储,我们面临两个看似矛盾的需求:

  1. 极速验证:每个接口请求(QPS 可能高达数万)都要验证 Token,延迟必须在毫秒级。
  2. 数据安全与管理:Token 关系到用户安全,不能丢;管理员需要在后台查询、踢人下线,需要复杂的查询能力。

解决方案: 采用 "Redis (热数据) + MySQL (冷数据)" 的双存储架构。


二、 核心问题 1:后端鉴权时,该读 Redis 还是 MySQL?

结论:只读 Redis,绝不读 MySQL。

当用户发起请求 GET /order/list 并携带 Bearer Token 时,后端的拦截器(Filter)执行流程如下:

  1. Redis 是"地铁闸机"

    • 拦截器直接去 Redis 查询该 Token。
    • 有数据 :放行。耗时 < 1ms
    • 无数据 :直接拦截,返回 401 Unauthorized不进行 MySQL 回源查询。
  2. MySQL 是"户籍档案室"

    • MySQL 的作用不是用来给代码做实时鉴权的。
    • 如果每个请求都查 MySQL,数据库连接池瞬间就会被耗尽,整个系统会因为鉴权逻辑而崩溃。

原则: 在高频的鉴权场景下,Redis 是唯一的 "权威(Authority)"


三、 核心问题 2:Redis 和 MySQL 的一致性如何保持?

既然两边都存了,如何保证数据不打架?我们按 Token 的生命周期分为四个阶段来看:

1. 登录阶段(创建:双写)

当用户登录成功生成 Token 时:

  • 动作 A :将 Token 信息插入 MySQL(作为持久化备份,供管理员查询)。
  • 动作 B :将 Token 信息写入 Redis ,并设置 TTL (过期时间)(如 30 分钟)。
  • 一致性评价:强一致。

2. 鉴权阶段(读取:Redis 主导)

  • 动作:只读 Redis。
  • 异常情况:如果 Redis 数据丢了(如宕机)但 MySQL 还在,怎么办?
  • 策略认栽。系统视作用户"未登录",前端会触发刷新 Token 或重新登录流程。绝不回源查 DB,防止缓存击穿导致数据库雪崩。

3. 过期阶段(自然消亡:最终不一致)

  • 动作
    • Redis:TTL 一到,自动删除 Key。用户访问报 401。
    • MySQL:数据依然存在,变成了"历史垃圾数据"。
  • 策略允许不一致。这种不一致对业务无害(因为鉴权只看 Redis),MySQL 的历史数据可以通过定时任务清理。

4. 登出/踢人阶段(销毁:双删)

这是最关键的一步,必须保证安全。

  • 动作显式删除 MySQL + 显式删除 Redis
  • 顺序建议删 DB -> 删 Redis(符合 Cache Aside Pattern)。
  • 策略:必须确保 Redis 被删掉,否则用户在 Token 过期前还能非法访问。
相关推荐
HUGu RGIN6 小时前
MySQL--》如何在MySQL中打造高效优化索引
android·mysql·adb
HackTwoHub7 小时前
AI大模型网关存在SQL注入、附 POC 复现、影响版本LiteLLM 1.81.16~1.83.7(CVE-2026-42208)
数据库·人工智能·sql·网络安全·系统安全·网络攻击模型·安全架构
l1t7 小时前
DeepSeek总结的DuckLake构建基于 SQL 原生表格式的下一代数据湖仓
数据库·sql
KmSH8umpK7 小时前
Redis分布式锁从原生手写到Redisson高阶落地,附线上死锁复盘优化方案进阶第八篇
数据库·redis·分布式
TDengine (老段)8 小时前
从施工监测到运营预警,桥科院用 TDengine 提升桥梁数据管理能力
大数据·数据库·物联网·时序数据库·tdengine·涛思数据
callJJ8 小时前
Spring Data Redis 两种编程模型详解:同步 vs 响应式
java·spring boot·redis·python·spring
S1998_1997111609•X9 小时前
论mysql国盾shell-sfa犯罪行为集团下的分项工程及反向注入原理尐深度纳米算法下的鐌檵鄐鉎行为
网络·数据库·网络协议·百度·开闭原则
KmSH8umpK10 小时前
Redis分布式锁从原生手写到Redisson高阶落地,附线上死锁复盘优化方案进阶第七篇
数据库·redis·分布式
0xDevNull10 小时前
Linux 中 Nginx 代理 Redis 的详细教程
redis·后端
BU摆烂会噶11 小时前
【LangGraph】持久化实现的三大能力——时间旅行
数据库·人工智能·python·postgresql·langchain