通过migrate命令实现两个redis实例之间的数据迁移

本文涉及的产品
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Redis 版,经济版 1GB 1个月
简介: 通过migrate命令实现两个redis实例之间的数据迁移

本文适用于将源服务器的redis实例的key的数据迁移到其他服务器的redis实例

一、migrate简介:

migrate用于在Redis实例间进行数据迁移,实际上migrate命令是将dump、restore、del三个命令进行组合,从而简化了操作流程。migrate命令具有原子性,从Redis 3.0.6版本后已经支持迁移多个键的功能。migrate命令的数据传输直接在源Redis和目标Redis上完成,目标Redis完成restore后会发送OK给源Redis。

二、migrate命令参数:

MIGRATE host port key| destination-db timeout [COPY] [REPLACE] [AUTH password] [AUTH2 username password] [KEYS key]
重要参数解释:

host:目标Redis的IP地址

port:目标Redis的端口

key|“”:Redis 3.0.6 后如果需要迁移多个键,此处为空字符串""

destination-db:目标Redis的数据库索引

timeout:迁移的超时时间(单位为毫秒)

copy:如果添加此选项后,迁移后不删除源键。

replace:如果添加此选项migrate不管目标Redis是否存在该键都会正常迁移进行数据覆盖,如果不提供此参数且目标redis存在该键,则抛出异常”(error) ERR Target instance replied with error: BUSYKEY Target key name already exists.“

keys:如果要迁移多个键 keys key1 key2 key3 key4

示例:

将name1 复制到目标redis的0库,超时时间为1s,不删除源redis的key,覆盖目标redis中相同的key

MIGRATE 127.0.0.1 6379 name1 0 1000 copy replace

如果移动多个key:

MIGRATE 127.0.0.1 6379 "" 2 5000 copy replace keys key1 key2 key3 key4

三、实践测试:

1、我在本地模拟了两个redis实例。ip都为127.0.0.1,端口一个是默认的6379,一个是63791

并且分别set了不同的key

127.0.0.1:63791> keys *
1) "age"
2) "like"
3) "colour"
127.0.0.1:6379> keys *
1) "student"

2、在源redis实例63791上执行迁移命令

将age 复制到目标redis的0库,超时时间为1s,不删除源redis的key,覆盖目标redis中相同的key

127.0.0.1:63791> keys *
1) "age"
2) "like"
3) "colour"
127.0.0.1:63791>
127.0.0.1:63791>
127.0.0.1:63791>
127.0.0.1:63791>
127.0.0.1:63791> MIGRATE 127.0.0.1 6379 age 0 1000 copy replace
OK

查看6379的redis实例,可以看到age迁移成功

127.0.0.1:6379> keys *
1) "age"
2) "student"
127.0.0.1:6379> get age
"22"

再试一下replace这个参数的作用,增加这个参数代表覆盖目标key,验证一下,现在6379的实例的age是22

我们在源实例里将age改一下,然后再迁移

127.0.0.1:63791> set age 99
OK
127.0.0.1:63791> get age
"99"
127.0.0.1:63791> MIGRATE 127.0.0.1 6379 age 0 1000 copy replace
OK

查看目标实例

可以看到age已经被覆盖了

127.0.0.1:6379> keys *
1) "age"
2) "student"
127.0.0.1:6379>
127.0.0.1:6379> get age
"99"

如果不想覆盖目标实例的key,可以把replace参数去掉,在源实例执行一下命令

可以看到抛出了异常,key已经存在

127.0.0.1:63791> MIGRATE 127.0.0.1 6379 age 0 1000 copy
(error) ERR Target instance replied with error: BUSYKEY Target key name already exists.

迁移多个key的命令:

127.0.0.1:63791> MIGRATE 127.0.0.1 6379 "" 0 1000 copy replace keys age like colour
OK

查看目标实例

可以看到数据都被迁移了过来

127.0.0.1:6379> keys *
1) "like"
2) "age"
3) "student"
4) "colour"

剩下的其他参数大家可以自己验证一下~


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
6天前
|
NoSQL Java Redis
如何使用Redis的setNx命令来实现分布式锁
如何使用Redis的setNx命令来实现分布式锁
|
2天前
|
NoSQL Redis 开发工具
在多核 CPU 或 NUMA 架构的机器上运行 Redis 实例时应该注意什么
在多核 CPU 或 NUMA 架构的机器上运行 Redis 实例时应该注意什么
|
2天前
|
NoSQL 网络协议 Redis
如何判断 Redis 性能下降是否由复杂度过高的命令引起
如何判断 Redis 性能下降是否由复杂度过高的命令引起
|
2天前
|
NoSQL Redis 容器
如何判断 Redis 实例是否写入了 bigkey
如何判断 Redis 实例是否写入了 bigkey
|
2天前
|
NoSQL Java 编译器
如何保证Redis在fork时没有处于inflight状态的命令
如何保证Redis在fork时没有处于inflight状态的命令
|
29天前
|
存储 NoSQL 关系型数据库
Redis系列学习文章分享---第一篇(Redis快速入门之初始Redis--NoSql+安装redis+客户端+常用命令)
Redis系列学习文章分享---第一篇(Redis快速入门之初始Redis--NoSql+安装redis+客户端+常用命令)
55 1
|
1月前
|
NoSQL 关系型数据库 MySQL
linux服务器重启php,nginx,redis,mysql命令
linux服务器重启php,nginx,redis,mysql命令
34 1
|
22天前
|
存储 Java
Redis08命令-Hash类型,也叫散列,其中value是一个无序字典,类似于java的HashMap结构,Hash结构可以将对象中的每个字段独立存储,可以针对每字段做CRUD
Redis08命令-Hash类型,也叫散列,其中value是一个无序字典,类似于java的HashMap结构,Hash结构可以将对象中的每个字段独立存储,可以针对每字段做CRUD
|
22天前
|
存储 NoSQL Redis
Redis07命令-String类型字符串,不管是哪种格式,底层都是字节数组形式存储的,最大空间不超过512m,SET添加,MSET批量添加,INCRBY age 2可以,MSET,INCRSETEX
Redis07命令-String类型字符串,不管是哪种格式,底层都是字节数组形式存储的,最大空间不超过512m,SET添加,MSET批量添加,INCRBY age 2可以,MSET,INCRSETEX
Redis06-Redis常用的命令,模糊的搜索查询往往会对服务器产生很大的压力,MSET k1 v1 k2 v2 k3 v3 添加,DEL是删除的意思,EXISTS age 可以用来查询是否有存在1
Redis06-Redis常用的命令,模糊的搜索查询往往会对服务器产生很大的压力,MSET k1 v1 k2 v2 k3 v3 添加,DEL是删除的意思,EXISTS age 可以用来查询是否有存在1