首页/数据/Redis 进阶速查/GETDEL 与 GETEX:原子取删与 TTL 维护
数据结构与选型42 条

GETDEL 与 GETEX:原子取删与 TTL 维护

GETDEL 取值同时删除(适合一次性令牌),GETEX 取值同时设置或清除 TTL(适合续期场景),都是单命令原子完成。

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

一条命令做完取与改

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 或事务表达。

易错点

  • 把 GETEX 当自动续期用:不带选项时它不改变 TTL,续期逻辑静默失效
  • GETDEL 后调用方还需要该值:删除不可逆,使用路径要先确认清楚
  • GETEX PERSIST 造成永久键:会话类数据无限堆积,内存缓慢上涨
  • 拿它们替代 Lua 做复杂逻辑:只能覆盖取删与续期两类简单场景

数据来源与参考

  • Redis 官方文档:GETDEL 与 GETEX
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌