一条命令做完取与改
GETDEL 在取值的同时删除键,适合一次性令牌;GETEX 在取值的同时设置或清除 TTL,适合会话续期。两者都是单命令原子完成,避免了先读后改之间的竞态。相比读改写的两步操作,它们在并发下语义更明确,也少一次网络往返。
基本信息
| GETDEL | 取值并删除键 |
|---|---|
| GETEX | 取值并调整或清除 TTL |
| 版本 | 均需 Redis 6.2 及以上 |
| 原子性 | 单命令内完成,无竞态窗口 |
| 适用类型 | 仅字符串键,其他类型返回类型错误 |
典型使用场景
- 一次性验证码与下载令牌:取走即失效
- 会话续期:每次访问顺带延长过期时间
- 滑动窗口限流:取值并重置 TTL
- 幂等消费:取走任务标识防止重复处理
- 需要读改写原子性的简单场景,避免为此引入 Lua
调用示例
调用示例
redis-cli SET token:once abc123 EX 300 # 准备一个带过期的一次性令牌
redis-cli GETDEL token:once # 取值并删除,第二次调用返回 nil
redis-cli SETEX session:1001 1800 data # 会话初始 30 分钟过期
redis-cli GETEX session:1001 EX 1800 # 取值并把 TTL 重置为 1800 秒
redis-cli GETEX session:1001 PERSIST # 取值并移除过期时间,变成永久键
redis-cli TTL session:1001 # 验证续期或持久化是否生效
redis-cli GETEX session:1001 EXAT 1767225600 # 取值并设置绝对过期时间戳命令形态与边界
| 形态 | 行为 | 边界 |
|---|---|---|
| GETDEL | 键存在返回旧值并删除,不存在返回 nil | 删除与取值同时生效,不可撤销 |
| GETEX 无选项 | 只取值,不改变 TTL | 常被误解为会自动续期 |
| GETEX EX n | 取值并把 TTL 设为 n 秒 | 只对存在的键生效 |
| GETEX PERSIST | 取值并去掉过期时间 | 键变为永久,注意后续清理 |
| GETEX EXAT ts | 取值并设置绝对过期时间 | ts 为 Unix 时间戳,单位秒 |
| 两者通用 | 作用对象必须是字符串键 | 用在哈希、列表等类型上会报错 |
这两个命令都只适用于字符串键。GETEX 不带任何选项时等同于 GET,不会自动续期,这一点在会话逻辑里最容易被误用。
GETEX PERSIST 会把键变成永久键。如果业务默认会话都有过期时间,这一操作会留下永不清理的残留数据。
它们的价值在于把取删、取值加续期这两类常见组合收敛为单命令原子操作;更复杂的多步逻辑仍需要用 Lua 或事务表达。