*Redis RESTORE-ASKING 命令
RESTORE-ASKING 是 Redis 集群模式下用于在 ASKING 状态迁移期间恢复序列化键值的命令。主要用于集群重分片(Resharding)过程中,配合 ASKING 命令将键从一个节点迁移到另一个节点。
*语法
RESTORE-ASKING key ttl serialized-value [REPLACE] [ABSTTL] [IDLETIME seconds] [FREQ frequency]
*参数说明
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| key | String | 是 | 要恢复的键名 |
| ttl | Integer | 是 | 过期时间(毫秒),0 表示永不过期 |
| serialized-value | String | 是 | 通过 DUMP 命令获得的序列化值 |
| REPLACE | Flag | 否 | 如果键已存在则替换 |
| ABSTTL | Flag | 否 | 将 ttl 视为绝对 Unix 时间戳(毫秒) |
| IDLETIME | Integer | 否 | 设置对象空闲时间 |
| FREQ | Integer | 否 | 设置对象访问频率 |
*返回值
- OK:恢复成功
- Error:键已存在且未指定 REPLACE,或序列化数据无效
*时间复杂度
O(1) 用于创建键,加上键值大小相关的反序列化时间
*示例
*基本用法(集群迁移场景)
# 在源节点
> DUMP mykey
"\x00\x05hello\x06\x00\x8f>\xdd\x83Jb\x0e\xae"
# 在目标节点(ASKING 模式下)
> ASKING
OK
> RESTORE-ASKING mykey 0 "\x00\x05hello\x06\x00\x8f>\xdd\x83Jb\x0e\xae"
OK
*带过期时间恢复
> ASKING
OK
> RESTORE-ASKING mykey 3600000 "\x00\x05hello\x06\x00\x8f>\xdd\x83Jb\x0e\xae"
OK
> PTTL mykey
(integer) 3599990
*替换已存在的键
> ASKING
OK
> RESTORE-ASKING mykey 0 "\x00\x05world\x06\x00..." REPLACE
OK
*常见错误
| 错误 | 原因 | 解决 |
|---|---|---|
| ERR Target instance replied with error | 目标节点不在 ASKING 状态或键已存在 | 确保先执行 ASKING,或添加 REPLACE 选项 |
| ERR DUMP payload version | 序列化数据版本不兼容 | 确保源和目标 Redis 版本兼容 |
| ERR wrong number of arguments | 参数不足 | 检查 key、ttl 和 serialized-value 是否都提供 |
*最佳实践
- RESTORE-ASKING 专门用于集群重分片场景,普通数据迁移使用 RESTORE 即可
- 必须在执行 RESTORE-ASKING 前先执行 ASKING 命令
- 迁移过程中建议先 DUMP 再 RESTORE,确保数据一致性
- 使用 REPLACE 选项覆盖已存在的键,但要小心避免误覆盖
- 集群迁移完成后使用 CLUSTER SETSLOT 完成槽位迁移确认
*FAQ
Q1: RESTORE-ASKING 和 RESTORE 有什么区别? A: RESTORE-ASKING 用于集群重分片场景,允许在 ASKING 状态下恢复键。RESTORE 是普通的数据恢复命令,不依赖于 ASKING 状态。
Q2: 为什么需要先执行 ASKING? A: 在集群重分片过程中,目标节点会收到它不负责处理的槽位请求。ASKING 命令告诉目标节点这是一次性查询,允许执行后续命令。
Q3: 可以跨大版本使用 RESTORE-ASKING 吗? A: 需要注意 DUMP 数据的兼容性。不同 Redis 版本的 RDB 格式可能不同,建议使用相同或相近版本进行迁移。