0%

Redis (五) - 管理 Redis Server

前幾篇我們介紹了 Redis 的一些概念和操作方式,都是偏向如何使用 Redis。所以這篇就要來介紹如何管理 Redis Server。

Server 管理指令

Info

Info 可以取得 Server 上的各種資訊和統計數值。

1
127.0.0.1:6379> info [section]

section 可以指定只要顯示哪部分的訊息,例如 : CPU、Memory 等等。若沒指定 section 則會全部顯示。

範例 :

1
2
3
4
5
6
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 官網

Bgrewriteaof

Bgrewriteaof (Begin Rewrite AOF) 用於以異步的方式執行一個 AOF(Append Only File)文件的重寫。AOF 是一個儲存指令的文件,他會將所有有寫入要求的指令紀錄起來,在下次 Redis 重新啟動時再把這些指令從頭到尾執行一遍,就可以恢復重新啟動前的資料。

1
127.0.0.1:6379> bgrewriteaof

在 Redis 2.4 開始 AOF 重寫會由 Redis 自動觸發,Bgrewriteaof 仍可以用於手動觸發執行。

Bgsave

Bgsave 用於以異步的方式儲存當下的資料到硬碟。

1
127.0.0.1:6379> bgsave

Bgsave 會在 Redis 的安裝目錄下產生一個 dump.rdb 的檔案用於儲存資料再重起時讀取。檔案的位置可以使用 config get dir 來獲得。

上述介紹的 Bgrewriteaof 和 Bgsave 正是用來實現 Redis 持久化的作法,也就是當 Server 被關機了之後再重新啟動資料不會遺失。至於該用哪一個 Redis 官方也有針對兩種做法提出優缺點,但是官方還是建議兩種都使用,這樣可以提高持久化的效果。

詳細的比較之後會在另一篇作介紹和說明。

Save

Save 用於以同步的方式儲存當下的資料到硬碟。通常儲存到硬碟會由 Bgsave 指令來執行,但是如果負責保存資料的後台子 Process 出現問題時,還可以用 Save 作為最後手段。

1
127.0.0.1:6379> save

Lastsave

Lastsave 會顯示上一次儲存資料到硬碟的時間,以 Unix Timestamp 顯示。可以在 Bgsave 執行完後使用 Lastsave 來追蹤 Bgsave 是否完成。

1
127.0.0.1:6379> lastsave

Client

Client 可以用來查看和設定客戶端的相關資訊。Client 支援以下幾種指令 :

Getname
Getname 用於取得客戶端的名稱,不過新進的連線預設是沒有名字的所以會回傳 nil。

1
127.0.0.1:6379> client getname

Setname
Setname 用於設定客戶端的名稱。

1
127.0.0.1:6379> client setname <name>

範例 :

1
2
3
4
5
6
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 的客戶資訊。

1
127.0.0.1:6379> client list

範例 :

1
2
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 用於關閉客戶端的連線。

1
127.0.0.1:6379> client kill <addr>

addr 是客戶端的 ip:port。

範例 :

1
2
3
4
5
6
7
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 (一) - 基本概念 這篇我們有介紹過如何查看和修改配置。這裡我們介紹另外兩個指令。

Rewrite
Rewrite 用於重寫 redis.conf,因為使用 config set 所修改的配置可能會和 redis.conf 的文件描述不同,所以需要透過 Rewrite 指令來將配置重新寫入到 redis.conf。

1
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 只會顯示出一行。

範例 :

1
2
3
4
5
6
7
8
9
10
11
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 命令中的一些統計數據。

1
127.0.0.1:6379> config resetstat

詳細會重設哪些數據請參考 Redis 官網

Dbsize

Dbsize 用於顯示目前的 DB 的 Key 總數。

1
127.0.0.1:6379> dbsize

範例 :

1
2
3
4
5
6
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 的訊息。主要用於除錯使用。

1
127.0.0.1:6379> debug object <key>

範例 :

1
2
127.0.0.1:6379> debug object dbk1
Value at:00007FCD41012FE0 refcount:1 encoding:embstr serializedlength:5 lru:1141097 lru_seconds_idle:82

詳細的輸出訊息請參考 Redis 官網

Debug Segfault

Debug Segfault 用於開發時模擬 Bug 發生,他會執行一個不合法的 Memory Accsee 讓 Redis 掛掉。

範例 :

1
2
127.0.0.1:6379> debug segfault
Error: 遠端主機已強制關閉一個現存的連線。

Flushdb

Flushdb 會清空目前所在的 DB 的所有 Key,其他的 DB 不受影響,但是在使用上還是要小心使用。此外這個命令不會失敗。

1
127.0.0.1:6379> flushdb

範例 :

1
2
3
4
5
6
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 都會被清空。所以使用上要非常謹慎,而這個命令一樣也不會失敗。

1
127.0.0.1:6379> flushall

Monitor

Monitor 會即時的輸出 Redis Server 收到指令。

1
127.0.0.1:6379> monitor

範例 :

另外開啟一個 terminal 連線到 Redis Server,並輸入一些指令。再回到原本的 terminal 就可以看到指令都被輸出了。

1
2
3
4
5
6
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 。

1
127.0.0.1:6379> sync

範例 :

1
2
3
4
5
6
7
8
9
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
1
127.0.0.1:6379> shutdown [NOSAVE|SAVE]

save 是可以選擇是否要做的,若選擇 Save 會強制執行儲存,若選擇 Nosave 就不會儲存資料,相當於強制關閉 Server。

Slaveof

Slaveof 可以將目前的 Redis Server 轉換為某個 Redis Server 的附屬 Server。

1
127.0.0.1:6379> slaveof <host> <port>

如果目前的 Server 已經是某個主 Server 的附屬 Server,在設定完 slaveof 之後,這台 Server 就不會在跟原本的主 Server 進行同步。

範例 :

1
2
127.0.0.1:6379> slaveof 127.0.0.1 6379
OK

如果想讓某個附屬 Server 變成主 Server 可以設定 No One 來斷開主 Server,如下 :

1
2
127.0.0.1:6379> slaveof no one
OK

Slowlog

Slowlog 用來紀錄查詢指令的執行時間的日誌系統,也就是如果有指令執行時間超過設定的時間就會被紀錄下來。

1
127.0.0.1:6379> slowlog <subcommand> <argument>

subcommand 有以下幾種指令可以選擇 :

Get
Get 用於取得 SlowLog

1
127.0.0.1:6379> slowlog get <argument>

argument 可以指定要輸出顯示的 Slowlog 數量,未指定則輸出全部。

範例 :

首先為了測試要先將設定檔的 slowlog-log-slower-than 改成 10 微秒

1
2
3
4
5
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。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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 數量。

1
127.0.0.1:6379> slowlog len

範例 :

1
2
127.0.0.1:6379> slowlog len
(integer) 4

在 redis.conf 設定檔裡有 slowlog-max-len 這項設定,是用來設定 Slowlog 允許的最大紀錄數量。

範例 :

1
2
3
127.0.0.1:6379> config get slowlog-max-len
1) "slowlog-max-len"
2) "128"

Reset
Reset 用於清空 Slowlog。

1
127.0.0.1:6379> slowlog reset

範例 :

1
2
3
4
5
6
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 官網

參考

[1] Redis持久化----RDB和AOF 的區別
[2] Redis Server
[3] Redis 的使用規範