*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 中的一个)。