---
# System prepended metadata

title: Redis (五) - 管理 Redis Server
tags: [Redis]

---

# 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`
