鍵遷移概述:
鍵遷移就是把數據由一個Redis遷移到另一個Redis(例如從生產環境遷移到測試環境),或者在數據庫之間進行遷移
鍵遷移有三種方式:move、dump+restore、migrate
下面是三種方式的比較,建議使用migrate:
一、move
move key db
功能:將參數所指的key從當前源數據庫遷移到指定的數據庫中
這個命令是在單個Redis內部進行是用戶具有遷移
這個命令在實際生產環境中不建議使用
演示案例
0號數據庫有一個hello字符串鍵,1號數據庫為空,現在我們將0號數據庫的hello字符串鍵遷移到1號數據庫中
二、dump+restore
dump key
restore key ttl value
功能:這兩個命令的組合可以實現在不同的Redis數據庫實例之間進行數據遷移
整個遷移過程分為兩步:
源Redis端執行dump命令,將key鍵值序列化,格式采用的是RDB格式
目標Redis端執行restore命令,將上面序列化的值進行復原,其中ttl參數代表過期時間(如果為0代表沒有過期時間)
備注說明
有兩點需要注意:
第一,整個遷移過程并非原子性的,而是通過客戶端分步完成的
第二,遷移過程是使用兩個客戶端連接傳輸,不是在源Redis和目標Redis之間進行傳輸
演示案例
在源Redis上執行dum:
在目標Redis上執行restore:
三、migrate
migrate命令也是用于在Redis實例間進行數據遷移的
實際上migrate命令就是將dump、restore、del三個命令進行組合,從而簡化了操作流程
migrate命令具有原子性,而且從Redis3.0.6版本以后已經支持遷移多個鍵的功能,有效地提高了遷移效率,migrate在水平擴容(后面文章有介紹)中起到重要作用
遷移過程如下
整個過程如下圖所示:
實現過程和dump+restore基本類似,但是有3點不太相同:
第一,整個過程是原子執行的,不需要在多個Redis實例上開啟 客戶端的,只需要在源Redis上執行migrate命令即可
第二,migrate命令的數據傳輸直接在源Redis和目標Redis上完成的
第三,目標Redis完成restore后會發送OK給源Redis,源Redis接收后會根據migrate對應的選項來決定是否在源Redis上刪除對應的鍵
命令格式
migrate host port key|"" destination-db timeout [copy] [replace] [keys key [key
參數介紹如下:
host:目標Redis的IP地址
port:目標Redis的端口
key|"":在Redis3.0.6版本之前,migrate只支持遷移一個鍵,所以此處是要遷移的鍵,但Redis3.0.6版本之后支持遷移多個鍵,如果當前需要遷移多個鍵,此處為空字符串""
destination-db:目標Redis的數據庫索引,例如要遷移到0號數據庫,這里就寫0。
timeout:遷移的超時時間(單位為毫秒)
[copy]:如果添加此選項,遷移后并不刪除源鍵
[replace]:如果添加此選項,migrate不管目標Redis是否存在該鍵都會 正常遷移進行數據覆蓋
[keys key[key...]]:遷移多個鍵,例如要遷移key1、key2、key3,此處填 寫“keys key1 key2 key3”
演示案例①(單個鍵遷移)
例如我們開啟兩個redis服務端實例,一個為127.0.0.1:6379,一個為127.0.0.1:6380
情況1:源(127.0.0.1:6379)Redis有鍵hello,目標(127.0.0.1:6380)Redis沒有,遷移成功
migrate 127.0.0.1 6380 hello 0 1000
情況2:源Redis和目標Redis都有鍵hello:
如果migrate命令沒有加replace選項會收到錯誤提示(下面演示這種)
如果加了replace會返回OK表明遷移成功(讀者自己演示)
migrate 127.0.0.1 6380 hello 0 1000
情況3:源Redis沒有鍵hello,此種情況會收到nokey的提示
migrate 127.0.0.1 6380 hello 0 1000
演示案例②(多個鍵遷移)
源Redis批量添加多個鍵
mset key1 value1 key2 value2 key3 value3
源Redis執行如下命令完成多個鍵的遷移
migrate 127.0.0.1 6380 "" 0 5000 keys key1 key2 key3