Redis學習筆記—單個鍵管理

鍵重命名

rename key newkey

重命名鍵名“python”爲“java”

127.0.0.1:6379> set python jedis
OK
127.0.0.1:6379> rename python java
OK
127.0.0.1:6379> get python
(nil)
127.0.0.1:6379> get java
"jedis"

如果原來的鍵存在,rename會覆蓋原來的鍵的值

127.0.0.1:6379> set a b
OK
127.0.0.1:6379> set c d
OK
127.0.0.1:6379> rename a c
OK
127.0.0.1:6379> get a
(nil)
127.0.0.1:6379> get c
"b"

爲了防止強行覆蓋Redis提供了renamenx命令

renamenx key newkey

舉例說明

127.0.0.1:6379> set a b
OK
127.0.0.1:6379> set c d
OK
127.0.0.1:6379> renamenx a c
(integer) 0
127.0.0.1:6379> get a
"b"
127.0.0.1:6379> get c
"d"
127.0.0.1:6379> renamenx a e
(integer) 1

隨機返回一個鍵

randomkey

隨機返回鍵

127.0.0.1:6379> dbsize
(integer) 21
127.0.0.1:6379> randomkey
"user:ranking:2"
127.0.0.1:6379> randomkey
"java"
127.0.0.1:6379> randomkey
"user:2"

鍵過期

1.設置鍵過期

秒級:

expire key seconds

毫秒級:

pexpire key milliseconds
2.查看鍵的剩餘過期時間

秒級別

ttl

毫秒級

pttl
  • 大於等於0的整數:鍵剩餘的過期時間(ttl是秒,pttl是毫秒)
  • -1:鍵沒有設置過期時間
  • -2:鍵不存在。

設置鍵爲“java”過期時間100秒

127.0.0.1:6379> expire java 100
(integer) 1
127.0.0.1:6379> pttl java
(integer) 95390
127.0.0.1:6379> ttl java
(integer) 89
3.鍵在時間戳timestamp後過期

秒級時間戳:

<pre>expireat key timestamp</pre>

毫秒級時間戳:

pexpireat key milliseconds-timestamp

設置鍵“hello”在2019-03-11 15:35:42過期(秒時間戳是1552289742,毫秒爲1552289742000)

expireat hello 1552289742
4.清除鍵的過期時間
  1. persist 命令
persist key
  1. 字符串類型的key,直接set會清除key的過期時間
5.設置鍵值的同時添加過期時間
setex key seconds value

setex 不但是原子執行,同時減少了一次網絡通訊的時間

遷移鍵

遷移鍵功能非常重要,因爲有時候我們只想把部分數據由一個Redis遷移到另一個Redis(例如從生產環境遷移到測試環境),Redis發展歷程中提供了move、dump+restore、migrate三組遷移鍵的方法,它們的實現方式以及使用的場景不太相同

  1. move
move key db

move命令用於在Redis內部進行數據遷移,Redis內部可以有多個數據庫,彼此數據是相互隔離的,move就是從一個數據庫移動到另外一個數據庫

  1. dump+restore
dump key
restore key ttl value

dump+restore實現的是在不同Redis實例間進行數據遷移

  • 在源Redis實例上,dump命令會將鍵值序列化,格式採用的是RDB格式
  • 在目標Redis上,restore命令將上面序列化的值進行復原,其中ttl爲過期時間,如果ttl設置爲0則代表沒有過期時間

在主機1中對key的數據進行序列化,返回RDB格式的序列化value

127.0.0.1:6379> dump java
"\x00\x05jedis\t\x00b\xfc\b/\xf1'<)"

複製這個序列化的value,在主機2中restore遷移數據

127.0.0.1:6379> get java
(nil)
127.0.0.1:6379> restore java 0 "\x00\x05jedis\t\x00b\xfc\b/\xf1'<)"
OK
127.0.0.1:6379> get java
"jedis"
  1. migrate
migrate host port key|"" destination-db timeout [COPY] [REPLACE] [KEYS key]
  • host:目標Redis的IP地址
  • port:目標Redis的端口
  • key:如果單個鍵就寫鍵名,如果轉移多個鍵此處就寫雙引號""空字符串(Redis3.0.6版本之後支持遷移多個鍵)
  • destination-db:目標數據庫的索引,如果是0號數據庫就寫0
  • timeout:遷移的超時時間(毫秒)
  • [copy]:如果添加此選項,遷移後並不刪除源鍵
  • [replace]:如果添加此選項,migrate不管目標Redis是否存在該鍵都會正常遷移進行數據覆蓋
  • [KEYS key]:遷移多個鍵,例如要遷移key1、key2、key3,此處填寫“keys key1 key2 key3

mingrate實現的是在不同Redis實例間進行數據遷移,實際上migrate命令就是將dump、restore、del三個命令進行組合,從而簡化了操作流程。
這個命令是一個原子操作,它在執行的時候會阻塞進行遷移的兩個實例,直到以下任意結果發生:遷移成功,遷移失敗,等到超時。

開另一個端口爲6666的Redis實例

./redis-server --port 6666 &
redis-cli -h 127.0.0.1 -p 6666
127.0.0.1:6666> keys *
(empty list or set)

6379端口實例進行migrate的copy操作

127.0.0.1:6379> migrate 127.0.0.1 6666 java 0 1000 copy
OK
127.0.0.1:6379> get java
"jedis"

6666端口實例

127.0.0.1:6666> keys *
1) "java"

6379端口實例進行migrate的默認操作(dump——restore——del)

127.0.0.1:6379> set hello world 
OK
127.0.0.1:6379> get hello
"world"
127.0.0.1:6379> migrate 127.0.0.1 6666 hello 0 1000 
OK
127.0.0.1:6379> get hello
(nil)

6666端口實例

127.0.0.1:6666> keys *
1) "java"
2) "hello"

從端口6379端口實例批量遷移到6666端口實例

127.0.0.1:6379> mset Tom "It's a cat" Jerry "It's a mouse"
OK
127.0.0.1:6379> mget Tom Jerry
1) "It's a cat"
2) "It's a mouse"
127.0.0.1:6379> migrate 127.0.0.1 6666 "" 0 1000 keys Tom Jerry
OK
127.0.0.1:6379> mget Tom Jerry
1) (nil)
2) (nil)

6666端口實例

127.0.0.1:6666> keys *
1) "Tom"
2) "Jerry"
3) "java"
4) "hello"
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章