Redis鍵遷移

Federico發表於2017-12-16

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命令是將dumprestoredel三個命令進行組合,從而簡化了操作流程。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例項之間

相關文章