*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 错误。