当前位置:首页 > 文章列表 > 数据库 > Redis > Redis SET NX EX 组合为什么可能覆盖已有 TTL

Redis SET NX EX 组合为什么可能覆盖已有 TTL

来源:17golang原创 2026-09-08 17:38:39 0浏览 收藏

先给结论:SET key value NX EX 60 本身不会在键已经存在时覆盖旧值或旧 TTL,因为 NX 让这次写入直接失败;但只要一次 SET 真正成功,Redis 默认会把原来的 TTL 丢掉,EX 再给它设置新的过期时间。很多“NX EX 覆盖了 TTL”的问题,实际是把条件写入、普通覆盖和续期写在了不同分支里。

要点速览
  • NX 只控制“键不存在时才写”,不等于保留旧 TTL。
  • EX/PX 给本次成功写入设置新的过期时间;普通成功 SET 会丢弃旧 TTL。
  • 要更新值但保留剩余 TTL,使用 XX KEEPTTL;要初始化锁,使用 NX EX

Redis SET 的条件写入和 TTL 到底怎样组合

把这条命令拆开看就不容易误判:

SET lock:order:42 token-a NX EX 30
# NX:只有键不存在才允许这次写入。
# EX 30:写入成功后,把过期时间设置为 30 秒。
# 两个选项分别负责条件和过期策略,不负责互相兜底。

lock:order:42 不存在时,返回 OK,键值为 token-a,TTL 约为 30 秒。当键已经存在时,返回空结果,值、旧 TTL 都不应因这次命令改变。真正危险的是另一个场景:应用在别处执行了没有 NX 的成功 SET,或者用“先查再写”模拟条件判断。

Redis SET NX EX 的键存在条件、成功写入和 TTL 设置之间的静态关系图
图1:把键存在条件、SET 是否成功和 TTL 选项分成三个边界,NX 只决定条件,不承担旧 TTL 保留职责。

用三个键状态判断旧 TTL 是否会被改写

Redis 官方文档对 SET 的默认语义是:成功设置已有键时,旧 TTL 会被丢弃;KEEPTTL 才表示保留与键关联的剩余生存时间。可以用下面的表快速定位。

命令与状态SET 结果值变化TTL 结果
键不存在,NX EX 30OK创建新建 30 秒
键已有 TTL,NX EX 30空结果不变旧 TTL 保留
键已有 TTL,普通 SETOK覆盖旧 TTL 被清除
键已有 TTL,XX KEEPTTLOK更新剩余 TTL 保留

注意,EXPXEXATPXATKEEPTTL 是互斥的过期选项。因此不能指望用 NX EX 30 KEEPTTL 同时表达“创建时设置 30 秒,更新时又保留旧 TTL”。这两个业务意图应该拆成不同命令。

按业务语义选择 NX、XX 与 KEEPTTL

锁初始化通常只允许第一个请求成功,命令可以保持简单:

SET lock:order:42 token-a NX EX 30
# 返回 OK 才能进入临界区;空结果表示锁已被其他请求持有。

如果要在键已经存在时更新值,但不能把倒计时重新拉满,就选 XX KEEPTTL,不要再追加 EX

SET session:42 refreshed-token XX KEEPTTL
# XX:键必须存在;KEEPTTL:保留写入前剩余的 TTL。
# 返回空结果时,说明键可能已过期或条件不满足。

相反,续租或明确重置租期时,才使用 XX EX 30。这会把过期倒计时重新设为 30 秒,是“续期”而不是“保留 TTL”。客户端代码也应根据返回值记录分支,而不是只判断请求有没有抛异常:

result = redis.set("lock:order:42", token, xx=True, keepttl=True)
# result 为 True 才表示已有键被更新;False 表示条件没有满足。
if not result:
    return "lock_missing_or_expired"
return "updated_without_resetting_ttl"
Redis NX、XX、EX 与 KEEPTTL 按初始化、更新和续期语义分组的静态关系图
图2:初始化、保留剩余 TTL 的更新和显式续期是三种不同命令意图,避免把它们混成一条万能 SET。

用 TTL 与 PTTL 检查应用层是否误写

排查时不要只看 SET 返回 OK。在同一条业务链路里记录键名、条件分支、SET 返回值和写入前后的 TTL,才能判断 TTL 是被重置还是条件根本没通过。

TTL lock:order:42
PTTL lock:order:42
# TTL 返回秒,PTTL 返回毫秒;-1 表示没有过期时间,-2 表示键不存在。

如果已有键执行 NX EX 后 TTL 变化,先查是否实际命中了另一条普通 SETSET XX EX 或续期逻辑,再查是否存在“先 EXISTS/GET、后 SET”的非原子代码。对锁、幂等标记和会话刷新来说,推荐在代码评审中直接写出三种命令意图:

  • 只创建:NX EX/PX
  • 只更新且保留剩余时间:XX KEEPTTL
  • 只更新并重新计时:XX EX/PX

常见问题

NX EX 能不能保留已有键的 TTL?

已有键时因为 NX 条件失败,原 TTL 不会被这次命令改动;但这不是“保留选项”的效果。成功覆盖已有键并保留 TTL,应使用 KEEPTTL

为什么不能写成 NX EX 30 KEEPTTL

Redis 的过期选项互斥,EX 和 KEEPTTL 表达了两种不同的租期策略。创建和更新应按业务分支使用不同命令。

TTL 返回 -1 说明什么?

说明键存在但没有设置过期时间;-2 表示键不存在。两者都应结合 SET 返回值一起判断,不能只看一个数字。

参考:Redis SET 官方命令文档

版本声明
本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
Go nil slice 和空 slice 序列化结果为什么不一样Go nil slice 和空 slice 序列化结果为什么不一样
上一篇
Go nil slice 和空 slice 序列化结果为什么不一样
Go os.DirFS 配合 fs.ValidPath 怎么限制相对路径
下一篇
Go os.DirFS 配合 fs.ValidPath 怎么限制相对路径
查看更多
最新文章
查看更多
课程推荐
  • 前端进阶之JavaScript设计模式
    前端进阶之JavaScript设计模式
    设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
    543次学习
  • GO语言核心编程课程
    GO语言核心编程课程
    本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
    516次学习
  • 简单聊聊mysql8与网络通信
    简单聊聊mysql8与网络通信
    如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
    500次学习
  • JavaScript正则表达式基础与实战
    JavaScript正则表达式基础与实战
    在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
    487次学习
  • 从零制作响应式网站—Grid布局
    从零制作响应式网站—Grid布局
    本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
    485次学习
查看更多
AI推荐
  • H2O EvalGPT:开源LLM大模型评估与排行榜工具
    H2O EvalGPT
    H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
    29次使用
  • SuperCLUE中文大模型评测基准:功能、能力维度与应用指南
    SuperCLUE
    SuperCLUE是权威的中文大语言模型综合评测基准,涵盖语言理解、知识应用、AI Agent智能体及安全性等12项核心能力。通过多轮对话与客观测试,定期发布榜单与技术报告,为模型研发、优化及行业选型提供科学依据。
    182次使用
  • C-Eval中文评测基准:大语言模型多学科能力评估指南
    C-Eval
    深入了解C-Eval中文评估套件,涵盖52个学科与4级难度。本文详解其功能特点、Zero-shot/Few-shot使用方法及代码示例,助您全面评测LLM中文理解与泛化能力。
    120次使用
  • AI Prompt Library:免费AI提示词库,助力ChatGPT高效创作与营销
    AI Prompt Library
    探索AI Prompt Library免费资源库,涵盖营销、写作及多场景AI提示词。兼容ChatGPT、Claude等工具,一键复制优化输出,提升工作效率。
    46次使用
  • Generrated:DALL·E 2/3 AI绘画提示词灵感库与图像对比平台
    Generrated
    Generrated汇集9300+张DALL·E生成图像及对应提示词,支持查看完整图集、对比DALL·E 2与3版本差异,是AI绘图新手学习Prompt设计与获取创作灵感的实用工具。
    27次使用
微信登录更方便
  • 密码登录
  • 注册账号
登录即同意 用户协议隐私政策
返回登录
  • 重置密码