*Redis GETEX 命令

GETEX 获取键的字符串值,并可选择性地为键设置或修改过期时间。它是 GET + EXPIRE / PERSIST 的原子组合操作。


*语法

GETEX key [EX seconds | PX milliseconds | EXAT unix-time-seconds | PXAT unix-time-milliseconds | PERSIST]

*参数说明

参数 类型 必填 说明
key String 键名
EX seconds Integer 设置过期时间,单位为秒
PX milliseconds Integer 设置过期时间,单位为毫秒
EXAT unix-time-seconds Integer 设置绝对过期时间,Unix 时间戳(秒)
PXAT unix-time-milliseconds Integer 设置绝对过期时间,Unix 时间戳(毫秒)
PERSIST Flag 移除键的过期时间,使其永不过期

*返回值

  • String / Bytes:键的值
  • Nil:键不存在时返回 (nil)
  • Error:键值不是字符串类型

*时间复杂度

O(1)

*

*示例

*基本用法(获取并设置秒级过期)

> SET session "user123"
OK
> GETEX session EX 3600
"user123"
> TTL session
3600

*获取并设置毫秒级过期

> GETEX session PX 60000
"user123"
> PTTL session
59998

*获取并移除过期时间

> SET tempkey "important" EX 60
OK
> GETEX tempkey PERSIST
"important"
> TTL tempkey
-1

*键不存在的情况

> GETEX nonexist EX 60
(nil)

*常见错误

错误 原因 解决
WRONGTYPE Operation against a key holding the wrong kind of value 键值不是字符串类型 检查键的数据类型,仅对字符串键有效
ERR value is not an integer or out of range EX/PX/EXAT/PXAT 参数非整数或超出范围 传入有效的整数时间值
ERR syntax error 同时使用了多个时间选项或 PERSIST 与时间选项混用 只能选一种时间修饰符,且 PERSIST 不能与 EX/PX/EXAT/PXAT 同时使用

*最佳实践

  • 用于需要"读取并刷新过期时间"的场景,如 Session 续期、缓存刷新 TTL
  • 相比 GET + EXPIRE 两条命令,GETEX 是原子操作,避免了竞态条件
  • 使用 PERSIST 选项可以方便地实现"读取数据并使其永不过期"的需求

*FAQ

Q1: GETEX 与 GET + EXPIRE 有什么区别? A: GETEX 是原子操作,一次网络往返即可完成读取和过期时间设置;而 GET + EXPIRE 需要两次命令,期间可能因客户端崩溃或网络问题导致 EXPIRE 未执行。

Q2: GETEX 可以与其他数据类型一起使用吗? A: 不可以,GETEX 只能作用于字符串(String)类型的键。对 List、Hash 等类型会返回 WRONGTYPE 错误。

Q3: 同时传入 EX 和 PX 会怎样? A: 会返回语法错误。GETEX 只允许同一时间使用一种时间选项(EX / PX / EXAT / PXAT / PERSIST 中的一个)。