Redis MIGRATE命令

Redis MIGRATE命令教程

Redis MIGRATE 命令用于将 KEY 原子性地从当前 Redis 实例传送到目标实例的指定数据库上。如果传送成功, KEY 保证会出现在目标实例上,而当前实例上的 KEY 会被删除。

这个命令是一个原子操作,它在执行的时候会阻塞进行迁移的两个实例,直到以下任意结果发生:迁移成功,迁移失败,等到超时。

Redis MIGRATE命令详解

语法

192.168.98.70:6379> MIGRATE host port KEY destination-db timeout [COPY] [REPLACE]

参数

参数 描述
host 目的数据库的主机地址。
port 目的数据库的端口。
KEY 要传送的 KEY。
destination-db 要移动到的 Redis 的数据库,比如 0,1,2 等。
timeout 以毫秒为格式,指定当前实例和目标实例进行沟通的最大时间间隔。
这说明操作并不一定要在 timeout 毫秒内完成,只是说数据传送的时间不能超过这个 timeout 数。
COPY 可选,不移除源实例上的 KEY 。
REPLACE 可选,替换目标实例上已存在的 KEY 。

返回值

迁移成功时返回 OK ,否则返回相应的错误。

错误说明

MIGRATE 命令需要在给定的时间规定内完成 IO 操作。如果在传送数据时发生 IO 错误,或者达到了超时时间,那么命令会停止执行,并返回一个特殊的错误: IOERR 。

当 IOERR 出现时,有以下两种可能:

  • KEY 可能存在于两个实例。
  • KEY 可能只存在于当前实例。

唯一不可能发生的情况就是丢失 KEY ,因此,如果一个客户端执行 MIGRATE 命令,并且不幸遇上 IOERR 错误,那么这个客户端唯一要做的就是检查自己数据库上的 KEY 是否已经被正确地删除。

如果有其他错误发生,那么 MIGRATE 保证 KEY 只会出现在当前实例中。(当然,目标实例的给定数据库上可能有和 KEY 同名的键,不过这和 MIGRATE 命令没有关系)。

时间复杂度

O(N)

可用版本

>= 2.6.0

Redis MIGRATE命令内部实现

它在当前实例对给定 KEY 执行 DUMP 命令 ,将它序列化,然后传送到目标实例,目标实例再使用 RESTORE 命令对数据进行反序列化,并将反序列化所得的数据添加到数据库中。

当前实例就像目标实例的客户端那样,只要看到 RESTORE 命令返回 OK ,它就会调用 DEL 删除自己数据库上的 KEY 。

案例

先启动两个 Redis 实例,一个使用默认的 6379 端口,一个使用 6380 端口

# 连上 6379 端口 ./redis-cli # 清空所有的 KEY 192.168.98.70:6379> flushdb OK # 在 6379 端口设置一个键 192.168.98.70:6379> SET haicoder.net "I am haicoder, and i am from 6379" OK # 将 6379 上的 KEY,移到 6380 192.168.98.70:6379> MIGRATE 127.0.0.1 6380 haicoder.net 0 1000 OK # 迁移成功后 KEY 被删除 192.168.98.70:6379> EXISTS haicoder.net (integer) 0 # 使用另一个客户端,查看 6380 端口上的实例: $ ./redis-cli -p 6380 192.168.98.70:6380> GET haicoder.net "I am haicoder, and i am from 6379"

我们首先,使用 redis-cli 命令连上默认的 6379 端口。使用 flushdb 命令,清空数据库的所有的 KEY。接着,我们在 6379 端口的实例上设置值。

接着,将 6379 端口的实例上的 KEY 为 haicoder.net 的值移到 host 为 127.0.0.1 端口为 6380 的 0 号数据库上,并设置超时时间为 1000 毫秒。

最后,我们使用 EXISTS 命令检查 6379 实例上的 KEY 已被删除。并且使用 redis-cli 的 -p 选项,连上 6380 端口,从 6380 端口,获取从 6379 端口移到过来的值。

Redis MIGRATE命令总结

Redis MIGRATE 命令用于将 KEY 原子性地从当前 Redis 实例传送到目标实例的指定数据库上。Redis MIGRATE 命令语法:

192.168.98.70:6379> MIGRATE host port KEY destination-db timeout [COPY] [REPLACE]