Try   HackMD

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

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

Key 指令

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

Set

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

127.0.0.1:6379> set <key> <value>

Del

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

127.0.0.1:6379> del key1 key2 ...

範例 :

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

Dump

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

127.0.0.1:6379> dump key

範例 :

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 是否存在。

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

範例 :

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 過期後就會被刪除不可以再使用。設定的時間以秒為單位。

127.0.0.1:6379> expire <key> <seconds>

範例 :

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

127.0.0.1:6379> expireat key timestamp

範例 :

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。

127.0.0.1:6379> keys <pattern>

範例 :

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。

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。

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

Move

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

127.0.0.1:6379> move <key> <db>

範例 :

// 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 代表失敗。

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 永遠不會過期。

127.0.0.1:6379> persist <key>

範例 :

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 剩餘的過期時間。

127.0.0.1:6379> ttl <key>

範例 :

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。

127.0.0.1:6379> randomkey

範例 :

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

Rename

Rename 可以重新對 Key 命名。

127.0.0.1:6379> rename <key> <newkey>

範例 :

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 了。

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 的問題。

127.0.0.1:6379> renamenx <key> <newkey>

範例 :

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 的類型。

127.0.0.1:6379> type <key>

範例 :

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,每次會回傳一個新的游標位置表示目前迭代到哪。

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

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

範例 :

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。

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

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

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

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

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"

參考

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

tags: Redis