在之前的文章中我們已經介紹過了redis中有關鍵的命令,在一篇中我們將詳細了解一下這方面的內容。除此之外在這一篇中我們還將了解Redis中的數據庫相關的管理。下面我們將分3個部分來介紹Redis鍵管理方面的知識。它們分別是單個鍵、遍歷鍵、數據庫管理等。
單個鍵管理
1.鍵重命名
rename key newkey
我們看rename命令確實是可以給鍵重命名,但如果執行rename命令時新的鍵已經存在的,那么rename命令會將新的鍵的鍵的值替換掉。也就是如下圖所示:
當然既然使用rename命令是有風險的,所以Redis為了保證給鍵重命名的安全性于是提供了renamenx命令,顧名思義,renamenx命令就是保證當前新的鍵不存在時,給鍵重命名命令才可以成功。
如上圖所示,當renamenx命令給鍵重命名時,如果重命名的鍵是存在的,則renamenx命令返回0,表示當前命令執行失敗,否則返回1,則表示成功。
下面我們了解一下在使用rename命令或者renamenx命令時的注意事項。
- 由于在使用rename命令或者renamenx命令時會執行del命令刪除舊的鍵,所以如果舊的鍵中的值比較大時,可能會存在阻塞的情況。
- 如果在使用rename命令或者renamenx命令時,如果新的鍵與舊的鍵是相同時,則上述命令時可以執行成功的,但在Redis3.2之前版本會報錯。
2.隨機返回一個鍵
randomkey
3.鍵過期
expire key seconds expireat key timestamp
ttl命令和pttl命令都可以查詢鍵的剩余過期時間,但是pttl命令精度更高可以支持毫秒級。下面我們看一下ttl命令和pttl命令的返回值。
- 大于等于0的整數:鍵剩余的過期時間(ttl秒,pttl毫秒)。
- -1:鍵沒有設置過期時間
- -2:鍵不存在
下面我們看一下expireat命令。
expireat命令可以直接設置鍵的毫秒過期時間戳。除此之外Redis2.6版本之后還支持了毫秒級的過期時間。
pexpire key milliseconds pexpireat key milliseconds-timestamp
下面我們介紹一下在使用上述命令時的注意事項。
- 如使用上述命令時如果鍵不存在時,則直接返回0,表示該操作執行失敗。
- 如果使用上述命令時過期時間設置為負數,則當前鍵直接過期,并且會直接刪除,相當于執行del命令。
- persist命令可以將鍵的過期時間清除。
- 對于字符串類型的鍵,在執行set命令時,會默認去掉過期時間,在這點要特別注意,很容易忽視。
- Redis不支持二級數據結構內部元素的過期功能,例如不能設置列表或者集合類型中的某個元素設置過期時間。
- setnx命令作為set + expire組合,不但是原子性的,同時還減少了一次網絡通訊時間。
4.遷移鍵
顧名思義遷移鍵就是將鍵從一個地方遷移到另一個地方。比如將鍵從生產環境遷移到測試環境等等。在Redis中提供了3種方式來支持鍵的遷移功能,它們分別是move、dump + restore、migrate3種。但它們的底層實現方式,及使用場景均不太一樣。下面我們詳細了解一下。
(1)、move
move key db
move命令是在Redis的內部進行數據遷移,在Redis中實際上有多個數據庫的,所以move命令就是將指定的鍵從源數據庫移動目標數據庫中。Redis中數據庫相關的知識,我們將在后續的文章中在做介紹。
(2)、dump + restore
dump key restore key ttl serialized-value [REPLACE]
dump + restore也可以實現Redis中不同實例之間的數據遷移。但和move命令不同dump + restore要分2部實現,下面我們詳細了解一下。
- 在源數據庫上使用dump命令將鍵值序列化,格式采用的是RDB格式。
- 在目標數據庫中使用restore命令將上一步中的序列化的值進行復原,其中ttl參數表示過期時間,如果ttl等于0則表示沒有過期時間。
下面我們看一下dump + restore方式的注意事項。
- 整個遷移的過程中并非原子性的,而是通過客戶端分步完成的。
- 遷移的過程中是在兩個客戶端進行的,所以dump的結果不是在源數據庫和目標數據庫之間進行的。
下面我們完整演示一下使用dump + restore命令怎么遷移鍵。
1)、在源Redis中執行dump。
2)、在目標Redis中執行restore。
我們上述操作中啟用了2個客戶端,一個端口為6379另一個端口為6380。如果在使用dump和restore命令時,如果都在同一個端口客戶端中進行時,Redis會返回錯誤。
(3)、migrate
migrate host port key| destination-db timeout [COPY] [REPLACE] [KEYS key]
在Redis中migrate命令也可以實現鍵的遷移功能,它和上述的其它遷移命令相比,不同的就是migrate命令就是將dump、restore、del命令組合在了一起,并且簡化了操作流程。而且migrate命令還支持原子性操作。下面我們看一下使用migrate命令與dump + restore命令之間的不同之處。
- migrate命令整個過程都是原子性的,并且不需要開啟多個Redis客戶端。
- migrate命令的數據傳輸直接在源Redis和目標Redis中完成。
- 目標Redis完成restore后會發送OK給源Redis,源Redis接受后會根據migrate對應的選項來決定是否在源Redis上刪除對應的鍵。
下面我們詳細看一下migrate命令的相關參數。
- host:目標Redis的IP地址。 - port:目標Redis的端口。 - key|"":在Redis3.0.6版本之前,migrate只支持遷移一個鍵,所以此處就是要遷移的鍵,但Redis3.0.6版本之后是可以支持遷移多個鍵了,所以如果當前要遷移多個鍵時,此處為空字符串“”。 - destination-db:目標Redis的數據庫索引,因為上面提到過在Redis是有多個數據庫存在的,但相關的知識后續在做詳細介紹,這里我們只要先知道這個概念就可以了。 - timeout:鍵遷移的超市時間(單位毫秒)。 - [copy]:如果添加此選項,遷移后并不刪除源鍵。 - [replace]:如果添加此選項,migrate不管目標Redis是否存在該鍵都會進行數據遷移,并且覆蓋。 - [keys key [key ...]]:遷移多個鍵,遷移多少,就寫多少鍵。
下面我們演示一下通過migrate命令怎么遷移Redis中的鍵。
1)、源Redis有要遷移的鍵,而目標Redis中沒有:
下面我們執行以下命令:
migrate host port key| destination-db timeout [COPY] [REPLACE] [KEYS key]
在使用migrate命令遷移鍵時,有一點要特別注意,就是migrate命令在執行時,要在源Redis中執行,如果在目標Redis中執行時,是不會遷移成功的,也就是如上圖所示。
2)、源Redis和目標Redis都有要遷移的鍵。
在使用migrate命令遷移鍵時如果沒有添加replace參數時,則Redis會顯示錯誤,并且如果不添加copy命令時,當鍵成功遷移后,源Redis中的遷移鍵,將被刪除。
3)、源Redis中沒有要遷移的鍵。
下面我們演示一下批量遷移多個鍵的操作:
下面我們來比對一下上述3種鍵遷移的不同。