*Redis GETSET 命令

GETSET 获取键的旧值,并将其设置为一个新的字符串值。原子地执行 GET 和 SET 两个操作。

⚠️ 已废弃:从 Redis 6.2 开始,GETSET 被标记为已废弃。建议使用 SET key value GET 替代,功能完全相同且更灵活。


*语法

GETSET key value

*参数说明

参数 类型 必填 说明
key String 键名
value String / Bytes 要设置的新值

*返回值

  • String / Bytes:键的旧值
  • Nil:键不存在时返回 (nil),同时创建新键
  • Error:键存储的不是字符串类型

*时间复杂度

O(1)

*

*示例

*基本用法

> SET mycounter 10
OK
> GETSET mycounter 20
"10"
> GET mycounter
"20"

*键不存在时

> GETSET newkey "hello"
(nil)
> GET newkey
"hello"

*替代方案(SET ... GET)

> SET mycounter 100 GET
"20"
> GET mycounter
"100"

*常见错误

错误 原因 解决
WRONGTYPE Operation against a key holding the wrong kind of value key 不是字符串类型 确保 key 为 String 类型,或先删除再重建

*最佳实践

  • 新项目优先使用 SET ... GET:GETSET 已被废弃,新代码应使用 SET key value GET,该语法还支持 NX/XX/EX/PX 等选项
  • 适用于需要"读取旧值并赋新值"的原子场景,如计数器重置、状态切换
  • 如果键不存在,GETSET 会创建新键并返回 nil,需根据业务判断是否期望此行为

*FAQ

Q1: GETSET 和 SET ... GET 有什么区别? A: 功能完全一致,但 SET ... GET 是推荐的新语法,且可以配合 NX/XX/EX/PX 等选项使用,更加灵活。GETSET 已被标记为废弃,未来版本可能移除。

Q2: GETSET 会保留原有 TTL 吗? A: 不会。GETSET 相当于 SET,会清除原有的过期时间。如果需要保留 TTL,应使用 SET key value GET KEEPTTL(Redis 6.0+)。

Q3: GETSET 可以用于非字符串类型吗? A: 不可以。如果 key 是 List、Hash 等其他类型,GETSET 会返回 WRONGTYPE 错误。