• 通过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]
    
    • 1
    重要参数解释:

    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
    
    • 1

    如果移动多个key:

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

    三、实践测试:

    1、我在本地模拟了两个redis实例。ip都为127.0.0.1,端口一个是默认的6379,一个是63791
    并且分别set了不同的key

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

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

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

    127.0.0.1:6379> keys *
    1) "age"
    2) "student"
    127.0.0.1:6379> get age
    "22"
    
    • 1
    • 2
    • 3
    • 4
    • 5

    再试一下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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    查看目标实例
    可以看到age已经被覆盖了

    127.0.0.1:6379> keys *
    1) "age"
    2) "student"
    127.0.0.1:6379>
    127.0.0.1:6379> get age
    "99"
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    如果不想覆盖目标实例的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.
    
    • 1
    • 2

    迁移多个key的命令:

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

    查看目标实例
    可以看到数据都被迁移了过来

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

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

    文章持续更新,可以关注下方公众号或者微信搜一搜「 最后一支迷迭香 」第一时间阅读,获取更完整的链路资料。

  • 相关阅读:
    Parallels Desktop 19 for Mac(PD19虚拟机)详细图文安装教程分享
    2021CCPC山东省赛题解BCDFGHM
    (c语言)经典bug
    9月16日计算机视觉基础学习笔记——认识机器视觉
    22-07-04 西安 尚好房-项目经验总结(01)
    就是要让你搞懂Nginx,这篇就够了
    干货 | 携程数据基础平台2.0建设,多机房架构下的演进
    mysql explain详解
    selenium自动化测试入门 —— 设置等待时间
    Visual Studio 和 VSCode哪个更好?
  • 原文地址:https://blog.csdn.net/qq_38374397/article/details/134270937