当前位置: 首页 > news >正文

高并发场景下 Redis 存储 JWT 黑名单如何优化鉴权性能?

在高并发场景下,单纯依赖 Redis 存储 JWT 黑名单会导致每次鉴权都产生网络 RTT,成为性能瓶颈。工程实践中,最稳妥的优化方案是“短有效期 Token + 本地缓存 + 布隆过滤器 + Redis 兜底”的多级拦截策略。

核心结论:不要将所有鉴权压力直接打在 Redis 上。通过多级缓存过滤大部分合法请求,仅在疑似黑名单请求时查询 Redis。

  • 先定位:使用 Arthas 或 APM 工具确认鉴权接口中 Redis 网络耗时占比。
  • 先做:实施 Access Token 短有效期(如 15 分钟),引入 Caffeine 本地缓存与 Redis Bloom Filter。
  • 再验证:对比优化前后鉴权接口 P99 延迟及 Redis CPU 使用率。

核心代码实现

以下基于 Java Spring Boot 环境,展示如何构建多级黑名单校验逻辑。关键在于布隆过滤器误判处理:当布隆过滤器返回“可能存在”时,必须二次查询 Redis 确认,避免误杀正常用户。

@Component
public class JwtBlacklistChecker {@Autowiredprivate RedisTemplate<String, String> redisTemplate;@Autowiredprivate RBloomFilter<String> bloomFilter;// 本地缓存:存储最近被确认黑名单的 JWT ID,减少穿透@Cacheable(value = "blacklistCache", expireAfterWrite = 5, unit = TimeUnit.MINUTES)private Cache<String, Boolean> localCache = Caffeine.newBuilder().maximumSize(10000).expireAfterWrite(5, TimeUnit.MINUTES).build();public void check(String jwtId) {// 1. 查本地缓存 (最快)if (Boolean.TRUE.equals(localCache.getIfPresent(jwtId))) {throw new AuthenticationException("Token 已在黑名单中");}// 2. 查布隆过滤器 (过滤大部分正常请求)// 注意:bloomFilter.contains 返回 true 仅代表"可能存在"if (bloomFilter.contains(jwtId)) {// 3. 二次确认 Redis (解决布隆过滤器误判问题)Boolean isBlacklisted = redisTemplate.hasKey("blacklisted:" + jwtId);if (Boolean.TRUE.equals(isBlacklisted)) {// 确认黑名单,写入本地缓存加速后续请求localCache.put(jwtId, true);throw new AuthenticationException("Token 已在黑名单中");}// 如果 Redis 返回 false,说明是布隆过滤器误判,放行请求}// 如果布隆过滤器返回 false,则一定不在黑名单,直接放行}
}

配置与部署细节

1. Redis Key 过期时间设置
黑名单 Key 必须设置过期时间,过期时间应略大于 Token 剩余有效期,防止内存泄漏。

SET blacklisted:jwt_id <value> EX <seconds>

2. 布隆过滤器初始化
需预估最大元素量和误判率。例如预期存储 100 万个黑名单 ID,误判率 0.01%:

BF.RESERVE jwtBlacklist 0.001 1000000

3. Refresh Token 刷新流程
Access Token 有效期缩短后,需配合 Refresh Token 机制。用户退出时,同时将 Access Token ID 和 Refresh Token ID 加入黑名单。

// 注销示例
public void logout(String accessTokenId, String refreshTokenId) {// 异步写入黑名单,避免阻塞退出流程asyncExecutor.execute(() -> {redisTemplate.setex("blacklisted:" + accessTokenId, 15, TimeUnit.MINUTES, "revoked");redisTemplate.setex("blacklisted:" + refreshTokenId, 7, TimeUnit.DAYS, "revoked");bloomFilter.add(accessTokenId);bloomFilter.add(refreshTokenId);});
}

验证与压测方法

优化效果需通过监控数据验证,避免主观猜测:

  1. 延迟对比:使用 JMeter 压测鉴权接口,对比优化前后 P99 延迟。预期本地缓存命中场景下延迟降至毫秒级。
  2. Redis 负载:观察 Redis info stats 中的 instantaneous_ops_per_sec。优化后,鉴权相关的 READ 操作应显著下降。
  3. 慢查询监控:定期执行 slowlog get 10,确认无大量鉴权相关的慢查询堆积。

常见坑与解决方案

1. 布隆过滤器误判导致正常用户被拦截
风险:布隆过滤器存在哈希冲突,可能将正常 ID 判为存在。
解决:代码中必须实现“布隆命中 -> 查 Redis 确认”的逻辑。只有 Redis 也确认存在时,才拒绝请求。

2. 分布式本地缓存一致性
风险:多实例部署时,某实例加入黑名单,其他实例本地缓存未同步。
解决:本地缓存仅作为“性能加速”,TTL 设置较短(如 5 分钟)。最终一致性依赖 Redis 兜底。若需强一致,可通过 Redis Pub/Sub 广播失效消息清除本地缓存。

3. 内存爆炸
风险:黑名单 Key 未设置过期时间,随时间无限增长。
解决:写入黑名单时,TTL 必须等于 Token 剩余有效期。对于 Refresh Token 黑名单,建议设置固定较长过期时间(如 7 天)后自动清理。

原文链接:https://www.zjcp.cc/ask/11324.html

http://www.rkmt.cn/news/1303122.html

相关文章:

  • 开源机械爪控制库:从PID算法到ROS集成的全栈开发指南
  • 怎样免费让老Mac重获新生:OpenCore Legacy Patcher专业教程
  • 基于OpenAI_Agent_Swarm的多智能体协作系统:从原理到实战
  • 技术视角:Sketchfab数据提取工具深度解析3D模型下载机制
  • 高效跨平台游戏模组下载:WorkshopDL完全指南
  • 3分钟学会用ncmdumpGUI:轻松解密网易云NCM音乐文件,享受真正的音乐自由
  • 3步快速上手:PotPlayer百度翻译插件实现视频字幕实时翻译
  • 如何用猫抓cat-catch轻松捕获网页媒体资源?浏览器资源嗅探扩展全攻略
  • 系统门窗行业豆包推广,价格与服务解析 - mypinpai
  • 构建团队知识流系统:从信息孤岛到智能工作流中枢
  • 魔兽争霸III增强插件WarcraftHelper:5分钟解决游戏痛点完整指南
  • 拆分APK安装终极指南:为什么SAI是你Android设备的必备神器
  • NVIDIA Profile Inspector:解锁显卡隐藏性能的终极调校工具完全指南
  • 通用框架操作系统:统一异构应用框架的运行时与治理平台
  • 量子退火在组合优化中的应用与性能分析
  • 【独家首发】ElevenLabs未公开文档泄露:藏文语音生成延迟<800ms的4种低延迟部署方案(含边缘推理配置)
  • 2026年论文保姆级手动降AI指南(附三款降AI率工具亲测) - 降AI实验室
  • 有实力的解决连接失效问题的钢结构加固公司推荐 - mypinpai
  • Windows安卓子系统完全指南:如何在Windows 11上免费安装和使用安卓应用
  • ElevenLabs泰文语音生成避坑清单:97.3%开发者忽略的3大音素对齐陷阱及修复方案
  • 【限时解禁】Midjourney Mud印相暗箱协议文档(v6.0.2内部白皮书节选):含17个未公开材质token、3类废弃prompt陷阱及官方调试日志解读
  • 并行LLM推理技术:Hogwild! Inference原理与应用
  • 终极免费硬件调优指南:用UXTU轻松解锁电脑隐藏性能
  • 零基础入门:如何用bili2text轻松将B站视频转为文字稿
  • Claude Code用户如何配置Taotoken解决密钥被封与额度不足问题
  • 基于Arduino与TSL2561的光照度测量系统:从硬件连接到软件调试
  • Arm Cortex-X2/X3架构解析与性能优化实践
  • nnU-Net v2实战:从零开始配置环境与训练自定义医学影像数据集
  • 基于Fire2012算法与FastLED库的Arduino LED篝火制作全攻略
  • 崩坏星穹铁道自动化助手终极教程:三月七小助手完整使用指南