*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 格式可能不同,建议使用相同或相近版本进行迁移。