0%

Redis (二) - Key 的管理與操作

上一篇介紹了 Redis 的基本概念和資料型態,這篇要來介紹 Key 如何管理與操作。

Key 指令

Redis 的 Key 指令可以用來管理 Key,上一篇介紹了 Redis 支援的資料型態,這些資料型態都是由一個 Key 去對應一個或多個值。所以都適用 Key 指令來管理。

Set

Set 指令是最基本建立 String 的指令,其他類型在上一篇有介紹對應的建立指令。

1
127.0.0.1:6379> set <key> <value>

Del

Del 用於刪除已經存在的 Key,可以一次指定刪除多個。

1
127.0.0.1:6379> del key1 key2 ...

範例 :

1
2
3
4
127.0.0.1:6379> set mobile iphone
OK
127.0.0.1:6379> del mobile
(integer) 1

Dump

Dump 用於序列化給的 Key 的 Value,並回傳輸出序列化後的值。

1
127.0.0.1:6379> dump key

範例 :

1
2
3
4
127.0.0.1:6379>  hset Tom sex male phone 0912345678
(integer) 2
127.0.0.1:6379> dump Tom
"\r))\x00\x00\x00\x1c\x00\x00\x00\x04\x00\x00\x03sex\x05\x04male\x06\x05phone\a\n0912345678\xff\t\x00*\xc9;D\xd0\xc16\xa1"

Exists

Exists 用於檢查 Key 是否存在。

1
127.0.0.1:6379> exists <key1> <key2> ...

範例 :

1
2
3
4
5
6
127.0.0.1:6379> exists Tom
(integer) 1
127.0.0.1:6379> del Tom
(integer) 1
127.0.0.1:6379> exists Tom
(integer) 0

Expire

Expire 指令用於設定 Key 的過期時間,當 Key 過期後就會被刪除不可以再使用。設定的時間以秒為單位。

1
127.0.0.1:6379> expire <key> <seconds>

範例 :

1
2
3
4
5
6
7
8
9
10
127.0.0.1:6379> set Tom 123
OK
127.0.0.1:6379> expire Tom 30
(integer) 1
127.0.0.1:6379> exists Tom
(integer) 1

// 經過 30 秒後
127.0.0.1:6379> exists Tom
(integer) 0

另有 pexpire 來設定過期時間,時間單位為毫秒。

Expireat

Expireat 和 Expire 一樣用於設定 Key 的過期時間,差別在於時間的格式是給 Unix Timestamp

1
127.0.0.1:6379> expireat key timestamp

範例 :

1
2
3
4
5
6
7
8
127.0.0.1:6379> expireat Tom 1594909320
(integer) 1
127.0.0.1:6379> exists Tom
(integer) 1

// 超過 TimeStamp 設定的時間後
127.0.0.1:6379> exists Tom
(integer) 0

另有 pexpireat 來設定過期時間,時間單位為毫秒。

Keys

Keys 用於查詢所有符合給定的 pattern 的 Key。

1
127.0.0.1:6379> keys <pattern>

範例 :

1
2
3
4
5
6
7
8
9
10
11
12
127.0.0.1:6379> set Tom 20
OK
127.0.0.1:6379> set Tommy 25
OK
127.0.0.1:6379> set Tomas 23
OK
127.0.0.1:6379> set Tim 22
OK
127.0.0.1:6379> set Terry 30
OK
127.0.0.1:6379> keys Tom
1) "Tom"

在 pattern 前後加上 * 可以查詢相似的 Key。

1
2
3
4
5
6
7
8
9
127.0.0.1:6379> keys Tom*
1) "Tommy"
2) "Tomas"
3) "Tom"
127.0.0.1:6379> keys *m*
1) "Tommy"
2) "Tomas"
3) "Tim"
4) "Tom"

pattern 給 * 可以列出所有的 Key。

1
2
3
4
5
6
127.0.0.1:6379> keys *
1) "Tommy"
2) "Tomas"
3) "Tim"
4) "Tom"
5) "Terry"

Move

Move 用於將目前所在的 DB 移動到指定的 DB。

1
127.0.0.1:6379> move <key> <db>

範例 :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
// Redis 預設的 DB 是 0
127.0.0.1:6379> select 0
OK
127.0.0.1:6379> set Frank 25
OK

// 移動到 DB 1
127.0.0.1:6379> move Frank 1
(integer) 1

// DB 0 中的 Frank 已經不存在了
127.0.0.1:6379> exists Frank
(integer) 0

// 切換使用 DB 1
127.0.0.1:6379> select 1
OK

// DB 1 裡有 Frank 了
127.0.0.1:6379[1]> exists Frank
(integer) 1

當兩個 DB 都有相同的 Key 會移動失敗,如下。最後 move 指令回傳 0 代表失敗。

1
2
3
4
5
6
7
8
9
10
127.0.0.1:6379[1]> select 0    
OK
127.0.0.1:6379> set Ben 45
OK
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> set Ben 45
OK
127.0.0.1:6379[1]> move Ben 0
(integer) 0

Persist

Persist 用於移除指定給 Key 的過期時間,讓 Key 永遠不會過期。

1
127.0.0.1:6379> persist <key>

範例 :

1
2
3
4
5
6
7
8
127.0.0.1:6379> set pony 20 EX 60
OK
127.0.0.1:6379> persist pony
(integer) 1
127.0.0.1:6379> set pony 20 EX 1
OK
127.0.0.1:6379> persist pony
(integer) 0

set 指令後面所接的 EX 可以直接設定過期時間,也可以用 setex 指令。

可以看到第一個 set 指令設定給 pony 60 秒,所以馬上再下 persist 還可以移除 pony 的過期時間,但是第二個 set 指令只設定給 pony 1 秒,當過期了 Key 被刪除了就沒辦法再進行操作了。

TTL

TTL 以秒為單位回傳 Key 剩餘的過期時間。

1
127.0.0.1:6379> ttl <key>

範例 :

1
2
3
4
127.0.0.1:6379> setex pony 120 24
OK
127.0.0.1:6379> ttl pony
(integer) 114

另有 pttl 以毫秒回傳 Key 剩餘的過期時間。

Randomkey

Randomkey 會隨機回傳 DB 中的一個 Key。

1
127.0.0.1:6379> randomkey

範例 :

1
2
3
4
5
6
127.0.0.1:6379> keys *
1) "Frank"
2) "Queen"
3) "Ben"
127.0.0.1:6379> randomkey
"Ben"

Rename

Rename 可以重新對 Key 命名。

1
127.0.0.1:6379> rename <key> <newkey>

範例 :

1
2
3
4
5
6
7
8
127.0.0.1:6379> set pony 24
OK
127.0.0.1:6379> rename pony ponyNew
OK
127.0.0.1:6379> get pony
(nil)
127.0.0.1:6379> get ponyNew
"24"

如果新的 Key 已經存在時,還是可以執行 Rename,但是新 Key 的 Value 會被覆蓋掉,如下,原本 PonyNew 的 Value 是 24,再 pony 重新命名之後, ponyNew 的 Value 被換成 30 了。

1
2
3
4
5
6
7
8
127.0.0.1:6379> get ponyNew
"24"
127.0.0.1:6379> set pony 30
OK
127.0.0.1:6379> rename pony ponyNew
OK
127.0.0.1:6379> get ponyNew
"30"

呈上,Rename 要謹慎使用,最好先檢查要換的新 Key 名稱有沒有人用,可以先用 exists 檢查。

Renamenx

Renamenx 也是幫 Key 重新命名,但是 Renamenx 會先檢查新的 Key 名稱是否存在,如果不存在才會執行。這也解決了 Rename 容易不小心覆蓋到其他 Key 的問題。

1
127.0.0.1:6379> renamenx <key> <newkey>

範例 :

1
2
3
4
5
6
127.0.0.1:6379> get ponyNew
"30"
127.0.0.1:6379> set pony 28
OK
127.0.0.1:6379> renamenx pony ponyNew
(integer) 0

Type

Type 會顯示指定的 Key 的類型。

1
127.0.0.1:6379> type <key>

範例 :

1
2
3
4
5
6
7
8
127.0.0.1:6379> set pony 1               
OK
127.0.0.1:6379> type pony
string
127.0.0.1:6379> hset ponyHash f1 v1 f2 v2
(integer) 2
127.0.0.1:6379> type ponyHash
hash

若 Key 不存在會回傳 none。

Scan

Scan 用於迭代 DB 中的 Key,每次會回傳一個新的游標位置表示目前迭代到哪。

1
127.0.0.1:6379> scan <cursor> MATCH <pattern> COUNT <count> TYPE <type>

cursor 是游標的位置,剩下的都是可以選擇要不要加。match 有加只會輸出符合 pattern 的 Key。Count 預設是迭代 10 筆。TYPE 可以選擇只要那些類型的 Key。

範例 :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 k4 v4 k5 v5 k6 v6 k7 v7 k8 v8 k9 v9 k10 v10 k11 v11 k12 v12
OK

// 游標從 0 開始,迭代 10 筆回傳游標為 15
127.0.0.1:6379> scan 0
1) "15"
2) 1) "k2"
2) "k10"
3) "k6"
4) "k9"
5) "k7"
6) "k12"
7) "k8"
8) "k5"
9) "k3"
10) "k11"

// 游標從 15 再繼續往下迭代,迭代到最後游標回到 0
127.0.0.1:6379> scan 15
1) "0"
2) 1) "k4"
2) "k1"

加入 Match 指定輸出要符合的 Pattern。

1
2
3
4
5
127.0.0.1:6379> scan 0 match k1*
1) "15"
2) 1) "k10"
2) "k12"
3) "k11"

加入 Count 指定要迭代的筆數。

1
2
3
4
5
6
7
127.0.0.1:6379> scan 0 count 5
1) "14"
2) 1) "k2"
2) "k10"
3) "k6"
4) "k9"
5) "k7"

加入 Type 指定輸出要符合的資料型態。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
127.0.0.1:6379> hset k20 f1 v1 f2 v2
(integer) 2
127.0.0.1:6379> mset k21 v21 k22 v22
OK
127.0.0.1:6379> scan 0 match k2* count 100
1) "0"
2) 1) "k2"
2) "k20"
3) "k22"
4) "k21"

// type 指定要 string,k20 是 hash 不會被輸出
127.0.0.1:6379> scan 0 match k2* count 100 type string
1) "0"
2) 1) "k2"
2) "k22"
3) "k21"

Summary

這一篇介紹了許多 key 的指令來管理和操作這些建立出來的 Key,這些只是較常用到的,更多 Key 的指令請參考 Redis 官網

參考

[1] Redis Commands
[2] Redis 键(key)