# Redis (五) - 管理 Redis Server 前幾篇我們介紹了 Redis 的一些概念和操作方式,都是偏向如何使用 Redis。所以這篇就要來介紹如何管理 Redis Server。 <!-- more --> ## Server 管理指令 ### Info Info 可以取得 Server 上的各種資訊和統計數值。 ```bash= 127.0.0.1:6379> info [section] ``` section 可以指定只要顯示哪部分的訊息,例如 : CPU、Memory 等等。若沒指定 section 則會全部顯示。 範例 : ```bash= 127.0.0.1:6379> info CPU # CPU used_cpu_sys:5.02 used_cpu_user:8.03 used_cpu_sys_children:0.00 used_cpu_user_children:0.00 ``` 詳細顯示的內容分別代表什麼請參考 [Redis 官網](https://redis.io/commands/info)。 ### Bgrewriteaof Bgrewriteaof (Begin Rewrite AOF) 用於以異步的方式執行一個 AOF(Append Only File)文件的重寫。AOF 是一個儲存指令的文件,他會將所有有寫入要求的指令紀錄起來,在下次 Redis 重新啟動時再把這些指令從頭到尾執行一遍,就可以恢復重新啟動前的資料。 ```bash= 127.0.0.1:6379> bgrewriteaof ``` 在 Redis 2.4 開始 AOF 重寫會由 Redis 自動觸發,Bgrewriteaof 仍可以用於手動觸發執行。 ### Bgsave Bgsave 用於以異步的方式儲存當下的資料到硬碟。 ```bash= 127.0.0.1:6379> bgsave ``` Bgsave 會在 Redis 的安裝目錄下產生一個 `dump.rdb` 的檔案用於儲存資料再重起時讀取。檔案的位置可以使用 `config get dir` 來獲得。 上述介紹的 Bgrewriteaof 和 Bgsave 正是用來實現 Redis 持久化的作法,也就是當 Server 被關機了之後再重新啟動資料不會遺失。至於該用哪一個 Redis 官方也有針對兩種做法提出優缺點,但是官方還是建議兩種都使用,這樣可以提高持久化的效果。 詳細的比較之後會在另一篇作介紹和說明。 ### Save Save 用於以同步的方式儲存當下的資料到硬碟。通常儲存到硬碟會由 Bgsave 指令來執行,但是如果負責保存資料的後台子 Process 出現問題時,還可以用 Save 作為最後手段。 ```bash= 127.0.0.1:6379> save ``` ### Lastsave Lastsave 會顯示上一次儲存資料到硬碟的時間,以 Unix Timestamp 顯示。可以在 Bgsave 執行完後使用 Lastsave 來追蹤 Bgsave 是否完成。 ```bash= 127.0.0.1:6379> lastsave ``` ### Client Client 可以用來查看和設定客戶端的相關資訊。Client 支援以下幾種指令 : **Getname** Getname 用於取得客戶端的名稱,不過新進的連線預設是沒有名字的所以會回傳 nil。 ```bash= 127.0.0.1:6379> client getname ``` **Setname** Setname 用於設定客戶端的名稱。 ```bash= 127.0.0.1:6379> client setname <name> ``` 範例 : ```bash= 127.0.0.1:6379> client getname (nil) 127.0.0.1:6379> client setname c1 OK 127.0.0.1:6379> client getname "c1" ``` **List** List 用於列出所有連線到 Redis Server 的客戶資訊。 ```bash= 127.0.0.1:6379> client list ``` 範例 : ```bash= 127.0.0.1:6379> client list id=19 addr=127.0.0.1:50200 fd=10 name=c1 age=492 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=18446744073709537584 events=r cmd=client ``` 可以看到列出來的客戶資訊,name 是 c1,正是前面介紹 setname 所設定的名稱。 **Kill** Kill 用於關閉客戶端的連線。 ```bash= 127.0.0.1:6379> client kill <addr> ``` addr 是客戶端的 ip:port。 範例 : ```bash= 127.0.0.1:6379> client list id=19 addr=127.0.0.1:50200 fd=10 name=c1 age=713 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=18446744073709537584 events=r cmd=client id=20 addr=127.0.0.1:50453 fd=15 name=c2 age=14 idle=5 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=18446744073709537584 events=r cmd=client 127.0.0.1:6379> client kill 127.0.0.1:50453 OK 127.0.0.1:6379> client list id=19 addr=127.0.0.1:50200 fd=10 name=c1 age=755 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=18446744073709537584 events=r cmd=client ``` ### Config Config 用於設定 Redis 的一些配置設定,在 [Redis (一) - 基本概念](https://tienyulin.github.io/redis-concept-docker-install-datatype/) 這篇我們有介紹過如何查看和修改配置。這裡我們介紹另外兩個指令。 **Rewrite** Rewrite 用於重寫 redis.conf,因為使用 config set 所修改的配置可能會和 redis.conf 的文件描述不同,所以需要透過 Rewrite 指令來將配置重新寫入到 redis.conf。 ```bash= 127.0.0.1:6379> config rewrite ``` config get 和 config set 所使用的格式和 redis.conf 有一些是不同的,例如 : * 15kb、20gb 這些儲存單位縮寫不可以用在 Config 指令,config set 只能用數字表示。例如 : 1k 要寫成 1000。 * 配置參數 save 在 redis.conf 是多行儲存,但是用 config get 只會顯示出一行。 範例 : ```bash= 127.0.0.1:6379> config get maxclients 1) "maxclients" 2) "10000" 127.0.0.1:6379> config set maxclients 10k (error) ERR Invalid argument '10k' for CONFIG SET 'maxclients' 127.0.0.1:6379> config set maxclients 10000 OK 127.0.0.1:6379> config get save 1) "save" 2) "jd 900 jd 300 jd 60" ``` ### Resetstat Resetstat 用於重設 Info 命令中的一些統計數據。 ```bash= 127.0.0.1:6379> config resetstat ``` 詳細會重設哪些數據請參考 [Redis 官網](https://redis.io/commands/config-resetstat)。 ### Dbsize Dbsize 用於顯示目前的 DB 的 Key 總數。 ```bash= 127.0.0.1:6379> dbsize ``` 範例 : ```bash= 127.0.0.1:6379> dbsize (integer) 4 127.0.0.1:6379> set dbk1 dbv1 OK 127.0.0.1:6379> dbsize (integer) 5 ``` ### Debug Object Debug Object 用於取得更多 Key 的訊息。主要用於除錯使用。 ```bash= 127.0.0.1:6379> debug object <key> ``` 範例 : ```bash= 127.0.0.1:6379> debug object dbk1 Value at:00007FCD41012FE0 refcount:1 encoding:embstr serializedlength:5 lru:1141097 lru_seconds_idle:82 ``` 詳細的輸出訊息請參考 [Redis 官網](https://redis.io/commands/object)。 ### Debug Segfault Debug Segfault 用於開發時模擬 Bug 發生,他會執行一個不合法的 Memory Accsee 讓 Redis 掛掉。 範例 : ```bash= 127.0.0.1:6379> debug segfault Error: 遠端主機已強制關閉一個現存的連線。 ``` ### Flushdb Flushdb 會清空目前所在的 DB 的所有 Key,其他的 DB 不受影響,但是在使用上還是要小心使用。此外這個命令不會失敗。 ```bash= 127.0.0.1:6379> flushdb ``` 範例 : ```bash= 127.0.0.1:6379> dbsize (integer) 4 127.0.0.1:6379> flushdb OK 127.0.0.1:6379> dbsize (integer) 0 ``` ### Flushall Flushall 會清空整個 Redis Server 的 Key,也就是所有的 DB 都會被清空。所以使用上要非常謹慎,而這個命令一樣也不會失敗。 ```bash= 127.0.0.1:6379> flushall ``` ### Monitor Monitor 會即時的輸出 Redis Server 收到指令。 ```bash= 127.0.0.1:6379> monitor ``` 範例 : 另外開啟一個 terminal 連線到 Redis Server,並輸入一些指令。再回到原本的 terminal 就可以看到指令都被輸出了。 ```bash= 127.0.0.1:6379> monitor OK 1594978139.863964 [0 127.0.0.1:59506] "COMMAND" 1594978142.758172 [0 127.0.0.1:59506] "ping" 1594978166.471990 [0 127.0.0.1:59506] "set" "k1" "v1" 1594978178.263123 [0 127.0.0.1:59506] "dbsize" ``` ### Sync Sync 用於同步主 Server 和其他的附屬 Server 。 ```bash= 127.0.0.1:6379> sync ``` 範例 : ```bash= 127.0.0.1:6379> sync Entering replica output mode... (press Ctrl-C to quit) SYNC with master, discarding 187 bytes of bulk transfer... SYNC done. Logging commands from master. "PING" "PING" "PING" "PING" "PING" ``` ### Shutdown Shutdown 用於關閉 Redis Server,命令執行時會執行以下這些操作 : * 所有客戶端會被中斷 * 如果至少有一個保存點在等待,會執行 Save 指令來儲存 * 如果 AOF 有被打開,會更新 AOF 文件 * 關閉 Redis Server ```bash= 127.0.0.1:6379> shutdown [NOSAVE|SAVE] ``` save 是可以選擇是否要做的,若選擇 Save 會強制執行儲存,若選擇 Nosave 就不會儲存資料,相當於強制關閉 Server。 ### Slaveof Slaveof 可以將目前的 Redis Server 轉換為某個 Redis Server 的附屬 Server。 ```bash= 127.0.0.1:6379> slaveof <host> <port> ``` 如果目前的 Server 已經是某個主 Server 的附屬 Server,在設定完 slaveof 之後,這台 Server 就不會在跟原本的主 Server 進行同步。 範例 : ```bash= 127.0.0.1:6379> slaveof 127.0.0.1 6379 OK ``` 如果想讓某個附屬 Server 變成主 Server 可以設定 No One 來斷開主 Server,如下 : ```bash= 127.0.0.1:6379> slaveof no one OK ``` ### Slowlog Slowlog 用來紀錄查詢指令的執行時間的日誌系統,也就是如果有指令執行時間超過設定的時間就會被紀錄下來。 ```bash= 127.0.0.1:6379> slowlog <subcommand> <argument> ``` subcommand 有以下幾種指令可以選擇 : **Get** Get 用於取得 SlowLog ```bash= 127.0.0.1:6379> slowlog get <argument> ``` argument 可以指定要輸出顯示的 Slowlog 數量,未指定則輸出全部。 範例 : 首先為了測試要先將設定檔的 slowlog-log-slower-than 改成 10 微秒 ```bash= 127.0.0.1:6379> config get slowlog-log-slower-than 1) "slowlog-log-slower-than" 2) "10000" 127.0.0.1:6379> config set slowlog-log-slower-than 10 OK ``` 接著執行任意指令後再使用 slowlog get 來取得 Slowlog。 ```bash= 127.0.0.1:6379> set k2 v2 OK 127.0.0.1:6379> slowlog get 1) 1) (integer) 1 2) (integer) 1594993219 3) (integer) 10 4) 1) "set" 2) "k2" 3) "v2" 5) "127.0.0.1:37942" 6) "" 2) 1) (integer) 0 2) (integer) 1594993213 3) (integer) 12 4) 1) "config" 2) "set" 3) "slowlog-log-slower-than" 4) "10" 5) "127.0.0.1:37942" 6) "" // 指定輸出數量為 1 127.0.0.1:6379> slowlog get 1 1) 1) (integer) 5 2) (integer) 1594993838 3) (integer) 296 4) 1) "COMMAND" 5) "127.0.0.1:37992" 6) "" ``` **Len** Len 用來查看目前的 Slowlog 數量。 ```bash= 127.0.0.1:6379> slowlog len ``` 範例 : ```bash= 127.0.0.1:6379> slowlog len (integer) 4 ``` 在 redis.conf 設定檔裡有 slowlog-max-len 這項設定,是用來設定 Slowlog 允許的最大紀錄數量。 範例 : ```bash= 127.0.0.1:6379> config get slowlog-max-len 1) "slowlog-max-len" 2) "128" ``` **Reset** Reset 用於清空 Slowlog。 ```bash= 127.0.0.1:6379> slowlog reset ``` 範例 : ```bash= 127.0.0.1:6379> slowlog len (integer) 7 127.0.0.1:6379> slowlog reset OK 127.0.0.1:6379> slowlog len (integer) 0 ``` ### Summary 這一篇我們介紹了許多管理 Redis Server 會用到的指令,若想知道更詳細的內容請參考 [Redis 官網](https://redis.io/commands#server)。 ## 參考 [1] [Redis持久化----RDB和AOF 的區別](https://blog.csdn.net/ljheee/article/details/76284082) [2] [Redis Server](http://doc.redisfans.com/server/index.html) [3] [Redis 的使用規範](https://mp.weixin.qq.com/s?__biz=MzA4MTc4NTUxNQ==&mid=2650519808&idx=1&sn=78d404047311bdc83a3a9f650e045f06&scene=21#wechat_redirect) ###### tags: `Redis`