# Redis (二) - Key 的管理與操作 [上一篇](https://tienyulin.github.io/redis-concept-docker-install-datatype/)介紹了 Redis 的基本概念和資料型態,這篇要來介紹 Key 如何管理與操作。 <!-- more --> ## Key 指令 Redis 的 Key 指令可以用來管理 Key,上一篇介紹了 Redis 支援的資料型態,這些資料型態都是由一個 Key 去對應一個或多個值。所以都適用 Key 指令來管理。 ### Set Set 指令是最基本建立 String 的指令,其他類型在上一篇有介紹對應的建立指令。 ```bash= 127.0.0.1:6379> set <key> <value> ``` ### Del Del 用於刪除已經存在的 Key,可以一次指定刪除多個。 ```bash= 127.0.0.1:6379> del key1 key2 ... ``` 範例 : ```bash= 127.0.0.1:6379> set mobile iphone OK 127.0.0.1:6379> del mobile (integer) 1 ``` ### Dump Dump 用於序列化給的 Key 的 Value,並回傳輸出序列化後的值。 ```bash= 127.0.0.1:6379> dump key ``` 範例 : ```bash= 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 是否存在。 ```bash= 127.0.0.1:6379> exists <key1> <key2> ... ``` 範例 : ```bash= 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 過期後就會被刪除不可以再使用。設定的時間以秒為單位。 ```bash= 127.0.0.1:6379> expire <key> <seconds> ``` 範例 : ```bash= 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](https://www.unixtimestamp.com/)。 ```bash= 127.0.0.1:6379> expireat key timestamp ``` 範例 : ```bash= 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。 ```bash= 127.0.0.1:6379> keys <pattern> ``` 範例 : ```bash= 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。 ```bash= 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。 ```bash= 127.0.0.1:6379> keys * 1) "Tommy" 2) "Tomas" 3) "Tim" 4) "Tom" 5) "Terry" ``` ### Move Move 用於將目前所在的 DB 移動到指定的 DB。 ```bash= 127.0.0.1:6379> move <key> <db> ``` 範例 : ```bash= // 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 代表失敗。 ```bash= 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 永遠不會過期。 ```bash= 127.0.0.1:6379> persist <key> ``` 範例 : ```bash= 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 剩餘的過期時間。 ```bash= 127.0.0.1:6379> ttl <key> ``` 範例 : ```bash= 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。 ```bash= 127.0.0.1:6379> randomkey ``` 範例 : ```bash= 127.0.0.1:6379> keys * 1) "Frank" 2) "Queen" 3) "Ben" 127.0.0.1:6379> randomkey "Ben" ``` ### Rename Rename 可以重新對 Key 命名。 ```bash= 127.0.0.1:6379> rename <key> <newkey> ``` 範例 : ```bash= 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 了。 ```bash= 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 的問題。 ```bash= 127.0.0.1:6379> renamenx <key> <newkey> ``` 範例 : ```bash= 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 的類型。 ```bash= 127.0.0.1:6379> type <key> ``` 範例 : ```bash= 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,每次會回傳一個新的游標位置表示目前迭代到哪。 ```bash= 127.0.0.1:6379> scan <cursor> MATCH <pattern> COUNT <count> TYPE <type> ``` cursor 是游標的位置,剩下的都是可以選擇要不要加。match 有加只會輸出符合 pattern 的 Key。Count 預設是迭代 10 筆。TYPE 可以選擇只要那些類型的 Key。 範例 : ```bash= 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。 ```bash= 127.0.0.1:6379> scan 0 match k1* 1) "15" 2) 1) "k10" 2) "k12" 3) "k11" ``` 加入 Count 指定要迭代的筆數。 ```bash= 127.0.0.1:6379> scan 0 count 5 1) "14" 2) 1) "k2" 2) "k10" 3) "k6" 4) "k9" 5) "k7" ``` 加入 Type 指定輸出要符合的資料型態。 ```bash= 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](https://redis.io/commands) [2] [Redis 键(key)](https://www.runoob.com/redis/redis-keys.html) ###### tags: `Redis`
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.