MIGRATE

Redis MIGRATE命令详解
本文详细介绍了Redis的MIGRATE命令,该命令可将key从当前实例原子性迁移到目标实例指定数据库。它是原子操作,执行时会阻塞实例,有timeout参数规定沟通间隔。还介绍了命令内部实现、可选项、版本、时间复杂度、返回值,并给出示例。

MIGRATE host port key destination-db timeout [COPY] [REPLACE]

将key原子性地从当前实例传送到目标实例地指定数据库上,一旦传送成功,key保证会出现在目标实例上,而当前实例上地的key会被删除。

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

命令的内部实现方式:在当前实例对给定key执行DUMP命令,将它序列化,然后传送到目标实例,目标实例再使用RESTORE对数据进行反序列化,并将反序列化所得的数据添加到数据库中;当前实例就像目标实例的客户端那样,只要看到RESTORE命令返回ok,它就会调用DEL删除自己数据库上的key。

timeout参数以毫秒为格式,指定当前实例和目标实例进行沟通的最大间隔时间。这说明操作并不一定要在timeout毫秒内完成,只是说数据传送的时间不能超过这个timeout数。

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

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

  • key 可能存在于两个实例
  • key 可能只存在与当前实例 

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

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

可选项:

  • copy:不移除源实例上的key。
  • REPLACE:替换目标实例上已存在的key。

版本:>=2.6.0

时间复杂度:

      这个命令在源实例上实际执行DUMP命令和DEL命令,在目标实例执行RESTORE命令,查看以上命令的文档可以看到详细的复杂度说明。

  key数据在两个实例之间传输的复杂度为O(N).

返回值:

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

eg:

先启动两个redis实例,一个使用默认的6379端口,一个使用7777端口。

cd /usr/local/Cellar/redis/4.0.11
./redis-server &
[1] 87681



./redis-server --port 7777 &
[2] 87692

然后用客户端连上6379端口的实例,设置一个键,然后将它迁移到7777端口的实例上:

./redis-cli
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> KEYS *
(empty list or set)
127.0.0.1:6379> SET greeting "Hello from 6379 instance"
OK
127.0.0.1:6379> MIGRATE 127.0.0.1 7777 greeting 0 1000
OK
127.0.0.1:6379> EXISTS greeting     #迁移成功后key被删除
(integer) 0

使用另一个客户端,查看7777端口上的实例:

./redis-cli -p 7777

127.0.0.1:7777> GET greeting
"Hello from 6379 instance"

转载于:https://www.cnblogs.com/winnerREN/p/9533304.html

migrate”常见释义为“迁移;移居;迁徙”,在不同领域有不同的含义和应用: ### 计算机领域 - **数据库迁移**:指将数据从一个数据库系统转移到另一个数据库系统的过程。例如,从 MySQL 数据库迁移到 PostgreSQL 数据库使用 Python 的 SQLAlchemy 库进行数据库迁移示例代码如下: ```python from sqlalchemy import create_engine, MetaData, Table # 源数据库连接 source_engine = create_engine('mysql+pymysql://user:password@host/source_db') # 目标数据库连接 target_engine = create_engine('postgresql://user:password@host/target_db') # 获取源数据库的元数据 metadata = MetaData() metadata.reflect(bind=source_engine) # 遍历所有表 for table_name in metadata.tables: table = metadata.tables[table_name] # 从源数据库中选择数据 select_query = table.select() with source_engine.connect() as source_conn: result = source_conn.execute(select_query) rows = result.fetchall() # 在目标数据库中创建表(如果不存在) table.create(bind=target_engine, checkfirst=True) # 将数据插入目标数据库 with target_engine.connect() as target_conn: target_conn.execute(table.insert(), rows) ``` - **服务器迁移**:将服务器上的应用程序、数据等迁移到新的服务器上。可以采用物理迁移和虚拟迁移等方式。物理迁移是将服务器硬件和软件整体迁移;虚拟迁移则是将虚拟机从一个虚拟化平台迁移到另一个虚拟化平台。 ### 生物学领域 - **动物迁徙**:动物由于繁殖、觅食、气候变化等原因而进行的一定距离的迁移活动。例如,鸟类的季节性迁徙,每年春秋两季,许多鸟类会在繁殖地和越冬地之间往返迁徙。 ### 社会学领域 - **人口迁移**:指人口在不同地区之间的移动。包括国内人口迁移和国际人口迁移。国内人口迁移可能是从农村到城市,以寻求更好的就业机会和生活条件;国际人口迁移则涉及不同国家之间的人口流动。 ### 语言学领域 - **语言迁移**:在第二语言学习过程中,学习者的母语知识会对第二语言的学习产生影响。当母语的某些特征迁移到第二语言中时,可能会出现正迁移(促进学习)或负迁移(干扰学习)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值