Redis鍵遷移
在使用Redis的過程中,很多時候我們會遇到需要進行鍵遷移的問題,需要將指定Redis中的指定資料遷移到其他Redis當中,鍵遷移有三種方法,我們來進行一一介紹。
一、move
move key db
move命令由於在Redis內部進行資料遷移,Redis內部可以有多個資料庫,彼此在資料上相互隔離,move key db
就是把指定的鍵從源資料庫移動到目標資料庫當中,但是不建議在生產環境中使用。
二、dump + restore
dump key
restore key ttl value
1.在源Redis上,dump命令會將鍵值序列化,格式採用RDB格式。
2.在目標Redis上,restore命令將上面序列化的值進行復原,其中ttl參數列示過期時間,ttl=0代表永不過期。
需要注意的是:
一、整個遷移過程並非原子性的,而是通過客戶端分部完成的。
二、遷移過程是開啟了兩個客戶端連線,所以dump得結果不是在源Redis和目標Redis之間進行傳輸。
Redis-source上執行的操作
127.0.0.1:6379> set key1 Federico
OK
127.0.0.1:6379> dump key1
"\x00\bFederico\x06\x00L\x88\xd4\xb3U/Y\xae"
在Redis-source上設定一個新的鍵值,將此鍵值進行序列化。
Redis-target上執行的操作
127.0.0.1:6380> get key1
(nil)
127.0.0.1:6380> restore key1 0 "\x00\bFederico\x06\x00L\x88\xd4\xb3U/Y\xae"
OK
127.0.0.1:6380> get key1
"Federico"
在Redis-target上檢視當前可以不存在後,將序列化後的key進行復原
三、migrate
migrate
用於在Redis例項間進行資料遷移,實際上migrate
命令是將dump
、restore
、del
三個命令進行組合,從而簡化了操作流程。migrate
命令具有原子性,從Redis 3.0.6版本後已經支援遷移多個鍵的功能。migrate
命令的資料傳輸直接在源Redis和目標Redis上完成,目標Redis完成restore後會傳送OK給源Redis。
migrate
引數:
- host:目標Redis的IP地址
- port:目標Redis的埠
- key|"":Redis 3.0.6 後如果需要遷移多個鍵,此處為空字串""
- destination-db:目標Redis的資料庫索引
- timeout:遷移的超時時間(單位為毫秒)
- copy:如果新增此選項後,遷移後不刪除源鍵。
- replace:如果新增此選項
migrate
不管目標Redis是否存在該鍵都會正常遷移進行資料覆蓋 - keys:如果要刪除多個建,填寫
keys key1 key2 key3
Redis-source
127.0.0.1:6379> set key1 Federico
OK
127.0.0.1:6379> set key2 sunshine
OK
127.0.0.1:6379> keys *
1) "key1"
2) "key2"
127.0.0.1:6379> MIGRATE 127.0.0.1 6380 key1 0 1000
OK
127.0.0.1:6379> keys *
1) "key2"
Redis-target
127.0.0.1:6380> keys *
1) "key1"
127.0.0.1:6380> GET key1
"Federico"
從源Redis上看到,我們設定了兩個鍵,執行預設引數遷移後只有了一個鍵。而在目標Redis上已經成功遷移過去了這個鍵。如果想同時保留源Redis上的資料,可以加上我們上面提到過的引數。
Redis-source
127.0.0.1:6379> keys *
1) "key2"
127.0.0.1:6379> MIGRATE 127.0.0.1 6380 key2 0 1000 copy
OK
127.0.0.1:6379> keys *
1) "key2"
Redis-traget
127.0.0.1:6380> keys *
1) "key1"
2) "key2"
127.0.0.1:6380> get key2
"sunshine"
這樣我們就將Redis鍵遷移的基本操作進行完了。
move、dump+restore、migrate三個命令的比較
命令 | 作用域 | 原子性 | 支援多個鍵 |
---|---|---|---|
move | Redis例項內部 | 是 | 否 |
dump+restore | Redis例項之間 | 否 | 是 |
migrate | Redis例項之間 | 是 | 是 |