首页/数据/Redis 进阶速查/EXPIRE 家族与选项:NX/XX/GT/LT
内存与管理99 条

EXPIRE 家族与选项:NX/XX/GT/LT

EXPIRE/PEXPIRE/EXPIREAT/PEXPIREAT 覆盖秒与毫秒、相对与绝对四种组合;7.0 起支持 NX/XX/GT/LT 选项控制只在无 TTL、已有 TTL、更长、更短时生效。

Redis 进阶速查数据更新于 2026-10-13

EXPIRE 家族是什么

EXPIRE 系列用来给键设置过期时间,四个命令分别覆盖「相对时间与绝对时间」「秒与毫秒」四个组合:EXPIRE 与 PEXPIRE 从当前时刻起算,EXPIREAT 与 PEXPIREAT 按 Unix 时间戳到期。7.0 起这些命令支持 NX、XX、GT、LT 四个选项,用来精确控制「什么时候才允许改动已有的过期时间」,避免并发场景下把更长或更短的 TTL 误覆盖掉。

基本信息

命令族EXPIRE / PEXPIRE / EXPIREAT / PEXPIREAT,另有毫秒级的 EXPIRETIME 查询
选项NX 无 TTL 时才设置,XX 已有 TTL 时才设置,GT 仅新值更长时生效,LT 仅新值更短时生效
查询与修改TTL / PTTL 查询剩余,PERSIST 移除过期时间,GETEX 读取时顺带改 TTL
返回值1 表示设置成功,0 表示条件不满足或键不存在
版本前提NX/XX/GT/LT 需要 7.0 及以上

典型使用场景

  • 会话与登录态:写入时直接带 EX,或用 EXPIRE 单独设置会话有效期
  • 缓存对象:SET 时带 EX 最简洁,需要动态延长时用 EXPIRE XX GT
  • 跨实例统一调度:用 EXPIREAT 按绝对时间点到期,避免各实例时钟起点不同
  • 续期保护:锁或租约在业务未完成时用 GT 延长,防止把别人的长租期改短
  • 临时键治理:给存量历史键批量补 TTL,用 NX 确保不会覆盖已有的过期设置

常用写法

常用写法
redis-cli EXPIRE session:abc 1800          # 相对时间,秒
redis-cli EXPIRE lock:k 30 NX              # 仅当键当前没有 TTL 时才设置
redis-cli EXPIRE cache:k 600 GT            # 仅当新 TTL 比现有更长才生效
redis-cli EXPIREAT cache:k 1799999999      # 绝对时间戳到期
redis-cli PERSIST cache:k                  # 移除过期时间,变永久键
redis-cli GETEX cache:k EX 300             # 读取并顺带改为 300 秒过期
redis-cli TTL cache:k                      # -1 表示有键无 TTL,-2 表示键不存在

选项语义

选项生效条件典型用途
NX键当前没有过期时间批量补 TTL 时不覆盖既有设置
XX键当前已有过期时间只调整已有生命周期的键
GT新 TTL 大于当前剩余续期场景,防止把租期改短
LT新 TTL 小于当前剩余提前失效,例如强制刷新缓存
GETEX 是读取与改写 TTL 的组合命令,支持 EX、PX、EXAT、PXAT 以及 PERSIST,可以在一次往返里完成「取值并延长有效期」,很适合读时续期的滑动过期会话。使用前要确认服务端版本支持该命令。
SET 会清掉原有 TTL:用 SET 覆盖写缓存时,如果不显式带上 EX 参数,原本会过期的键会变成永久键。这类隐性变化往往在内存增长后才被发现,覆盖写时务必明确过期语义。

易错点

  • 覆盖写缓存时忘记带 EX,键从「会过期」变成「永久存在」,内存随业务运行持续上涨
  • 在共享缓存上误用 GETEX 做读时续期,热点键被反复刷新永不过期,缓存失去自愈能力
  • 用 EXPIRE 处理需要跨实例对齐到期的场景,各实例调用时刻不同导致实际到期时间漂移,应改用 EXPIREAT 统一绝对时间
  • 对已有 TTL 的键直接 EXPIRE 补设置,把别人设置的长租期改短,需要明确语义时必须用 GT 或 XX 选项

数据来源与参考

  • Redis 官方文档:EXPIRE / EXPIREAT / GETEX / PERSIST 命令
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌