Skip to content

perf(redis-template): 优化update方法原子性,减少Redis网络往返次数,提升高并发场景性能与数据一致性#915

Open
07heco wants to merge 1 commit into
dromara:devfrom
07heco:perf/redis-lua-script-optimize
Open

perf(redis-template): 优化update方法原子性,减少Redis网络往返次数,提升高并发场景性能与数据一致性#915
07heco wants to merge 1 commit into
dromara:devfrom
07heco:perf/redis-lua-script-optimize

Conversation

@07heco

@07heco 07heco commented Mar 17, 2026

Copy link
Copy Markdown
Contributor

优化概述

本次 PR 针对 sa-token-redis-template 模块的 update 方法进行性能与原子性优化,无任何 API 变更,100% 向后兼容,核心解决原有实现的网络开销与数据一致性问题。

优化背景与现存问题

当前 SaTokenDaoForRedisTemplate 类中的 update 方法,在高并发生产场景下存在两个核心问题:

  1. 网络往返开销大:原有实现需要分两次执行 Redis 命令,先调用 getExpire 获取 key 的剩余过期时间,再调用 set 命令更新值,两次网络请求在高频调用场景下会显著增加响应延迟,拉高 CPU 开销。
  2. 非原子操作存在数据一致性风险:两次 Redis 请求之间,key 的过期时间可能被其他客户端修改,导致最终写入的过期时间不符合预期,出现数据不一致的问题。

优化方案

本次优化通过 Redis Lua 脚本实现操作的原子化改造,核心改动如下:

  1. 将「获取过期时间 + 更新值」两个操作合并为单次 Lua 脚本执行,整个逻辑在 Redis 服务端原子完成,仅需一次网络往返
  2. 将 Lua 脚本对象提取为类静态常量,在类加载时仅初始化一次并全局复用,避免高频调用场景下重复创建临时对象,减少 GC 压力
  3. 完整兼容原有所有业务场景,包括 key 不存在、key 永不过期、key 带剩余过期时间等全部边界情况,执行逻辑与原有语义完全对齐。

优化收益

  1. 数据一致性保障:整个更新操作在 Redis 中原子执行,彻底解决非原子操作带来的数据不一致风险。
  2. 性能显著提升:Redis 网络往返次数从 2 次减少至 1 次,提升高并发场景下接口吞吐量响应延迟大幅降低
  3. 内存占用优化:脚本对象全局复用,避免高频调用下的临时对象创建,降低 JVM 年轻代 GC 压力。
  4. 完全兼容无侵入:无任何 API 签名变更,业务方无需修改任何代码,升级版本即可享受优化收益。

兼容性保障

  1. 100% 向后兼容:所有 public 方法的签名、返回值、业务执行语义完全不变,用户无需修改任何业务代码。
  2. 线程安全:Lua 脚本执行与静态常量复用均无并发风险,多线程场景下执行安全可靠。
  3. 无新增依赖:完全复用项目现有组件,无任何额外依赖引入,不增加项目复杂度。
  4. 代码规范对齐:完全遵循项目现有代码风格、命名规范、注释格式,符合项目开发规范。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant