Redis 服务器管理相关命令
客戶端相關(guān)
查看客戶端列表
CLIENT LIST
自2.4.0可用。
時(shí)間復(fù)雜度:O(N) N是客戶端連接數(shù)量。
語(yǔ)法:CLIENT LIST
說(shuō)明:
Redis CLIENT LIST 命令用于返回所有連接到服務(wù)器的客戶端信息和統(tǒng)計(jì)數(shù)據(jù)。
返回值:
一個(gè)獨(dú)特的字符串,格式如下:
每個(gè)已連接客戶端對(duì)應(yīng)一行(以 LF 分割)
每行字符串由一系列 屬性=值(property=value) 形式的域組成,每個(gè)域之間以空格分開(kāi)。
下面是各字段的含義:
客戶端標(biāo)識(shí)
CLIENT LIST 命令中相關(guān)字段:
id: 唯一的64位的客戶端1ID(Redis 2.8.12加入)。
addr: 客戶端的地址和端口
fd: 套接字所使用的文件描述符
name:客戶端的名字,后面的 CLIENT SETNAME 和 CLIENT GETNAME 兩個(gè)命令會(huì)對(duì)其進(jìn)行說(shuō)明。
輸入緩沖區(qū)
Redis 為每個(gè)客戶端分配有輸入緩存區(qū),用于將客戶端發(fā)送的命令臨時(shí)保存。Redis 會(huì)從緩存區(qū)中拉取命令并執(zhí)行。輸入緩沖區(qū)會(huì)根據(jù)輸入內(nèi)容大小的不同動(dòng)態(tài)調(diào)整,只是要求每個(gè)客戶端緩沖區(qū)的大小不能超過(guò) 1G ,超過(guò)后客戶端將被關(guān)閉。
輸入緩沖區(qū)不受 maxmemory 控制,假設(shè)一個(gè) Redis 實(shí)例設(shè)置了 maxmemory 為4G,已經(jīng)存儲(chǔ)了2G數(shù)據(jù),但是如果此時(shí)輸入緩沖區(qū)使用了 3G,已經(jīng)超過(guò) maxmemory 限制,可能會(huì)產(chǎn)生數(shù)據(jù)丟失、鍵值淘汰、Out Of Memory 等情況。這種情況在正常使用過(guò)程中出現(xiàn)較少,但是需要注意防范 Redis 使用不規(guī)范導(dǎo)致出現(xiàn)這種情況
造成緩沖區(qū)過(guò)大的原因是 輸入命令過(guò)多,Redis 無(wú)法及時(shí)處理,可能的情況:
? a) 客戶端過(guò)多,命令輸入過(guò)多。
? b) 由于命令使用的不恰當(dāng)(key過(guò)大,或運(yùn)行時(shí)間復(fù)雜度較高的命令)等原因造成 Redis 阻塞無(wú)法處理新的命令,從而導(dǎo)致客戶端輸入的命令積壓在輸入緩沖區(qū),造成了輸入緩沖區(qū)過(guò)大。
監(jiān)控輸入緩沖區(qū)異常的方法有兩種:
a) 通過(guò)定期執(zhí)行 `CLIENT LIST` 命令,收集 `qbuf` 和 `qbuf-free` 找到異常的連接記錄并分析,最終找到可能出問(wèn)題的客戶端。該方法可以精準(zhǔn)的監(jiān)控每個(gè)客戶端,但執(zhí)行較慢,在連接數(shù)較多時(shí)可能會(huì)阻塞 Redis。b) 通過(guò) `INFO CLIENTS` 命令,找到最大的輸入緩沖區(qū)(`client_biggest_input_buf`),該命令相較于 `CLIENT LIST` 執(zhí)行較快,結(jié)果一目了然,但無(wú)法精準(zhǔn)到具體客戶端,無(wú)法查看緩存區(qū)大小等信息。CLIENT LIST 命令中相關(guān)字段:
qbuf: 查詢緩沖區(qū)的總?cè)萘?#xff08;字節(jié)為單位, 0 表示沒(méi)有分配查詢緩沖區(qū))
qbuf-free: 查詢緩沖區(qū)剩余容量(字節(jié)為單位, 0 表示沒(méi)有剩余空間)
輸出緩沖區(qū)
Redis為每個(gè)客戶端分配了輸出緩沖區(qū),它的作用是保存命令執(zhí)行的結(jié)果返回給客戶端,為Redis和客戶端交互返回結(jié)果提供緩沖。與輸入緩沖區(qū)不同的是,輸出緩沖區(qū)的容量可以通過(guò)參數(shù) client-outputbuffer-limit 來(lái)進(jìn)行設(shè)置,并且輸出緩沖區(qū)做得更加細(xì)致,按照客戶端的不同分為三種:普通客戶端、發(fā)布訂閱客戶端、slave客戶端,不同類(lèi)型的客戶端的輸出緩沖區(qū)不同可以分別進(jìn)行設(shè)置。
在 Redis 配置文件中可以配置:
client-output-buffer-limit <class> <hard limit> <soft limit> <soft seconds>
其中:
-
<class> :客戶端類(lèi)型,分為三種。
a)normal:普通客戶端;
b)slave:slave客戶端,用于復(fù)制;
c)pubsub:發(fā)布訂閱客戶端。
<hard limit>:如果客戶端使用的輸出緩沖區(qū)大于<hard limit>,客戶端會(huì)被立即關(guān)閉。
<soft limit> 和 <soft seconds> :如果客戶端使用的輸出緩沖區(qū)超過(guò)了 <soft limit> 并且持續(xù)了 <soft limit> 秒,客戶端會(huì)被立即關(guān)閉。
Redis 中對(duì)應(yīng)的默認(rèn)配置:
client-output-buffer-limit normal 0 0 0 client-output-buffer-limit slave 256mb 64mb 60 client-output-buffer-limit pubsub 32mb 8mb 60輸出緩沖區(qū)同樣存在內(nèi)存溢出的問(wèn)題。(見(jiàn) 輸入緩沖區(qū)相關(guān)內(nèi)容)
輸出緩沖區(qū)由兩部分組成:響應(yīng)緩沖區(qū)(16KB)和回復(fù)列表,其中響應(yīng)緩沖區(qū)返回比較小的執(zhí)行結(jié)果,而回復(fù)列表返回比較大的結(jié)果,例如大的字符串、HGEtALL 、SMEMBERS 命令的結(jié)果等。
響應(yīng)緩沖區(qū)使用的是字節(jié)數(shù)組,回復(fù)列表使用的是列表。當(dāng)響應(yīng)緩沖區(qū)存滿后會(huì)將 Redis 新的返回結(jié)果存放在回復(fù)列表的隊(duì)列中,隊(duì)列中的每個(gè)對(duì)象就是每個(gè)返回結(jié)果。
監(jiān)控輸出緩沖區(qū)異常的方法有兩種:
a) 通過(guò)定期執(zhí)行 `CLIENT LIST` 命令,收集 `obl`、`oll` 和 `omem` 找到異常的連接記錄并分析,最終找到可能出問(wèn)題的客戶端。該方法可以精準(zhǔn)的監(jiān)控每個(gè)客戶端,但執(zhí)行較慢,在連接數(shù)較多時(shí)可能會(huì)阻塞 Redis。b) 通過(guò) `INFO CLIENTS` 命令,找到最大的回復(fù)列表(`client_longest_output_list`),該命令相較于 `CLIENT LIST` 執(zhí)行較快,結(jié)果一目了然,但無(wú)法精準(zhǔn)到具體客戶端,無(wú)法查看緩存區(qū)大小等信息。相比于輸入緩沖區(qū),輸出緩沖區(qū)出現(xiàn)異常的概率相對(duì)會(huì)比較大,預(yù)防出現(xiàn)問(wèn)題的方法:
通過(guò)上面兩中方法進(jìn)行監(jiān)控,設(shè)置閾值,超閾值后及時(shí)處理。
顯示普通客戶端的輸出緩存區(qū):
client-output-buffer-limit normal 20mb 10mb 120
適當(dāng)增大 slave 的輸出緩沖區(qū)的,如果 master 節(jié)點(diǎn)寫(xiě)入較大,slave 客戶端的輸出緩沖區(qū)可能會(huì)比較大,一旦 slave 客戶端連接因?yàn)檩敵鼍彌_區(qū)溢出被 kill ,會(huì)造成復(fù)制重連。
限制容易讓輸出緩沖區(qū)增大的命令,例如,高并發(fā)下的 MONITOR 命令就是一個(gè)危險(xiǎn)的命令。
及時(shí)監(jiān)控內(nèi)存,一旦發(fā)現(xiàn)內(nèi)存抖動(dòng)頻繁,可能就是輸出緩沖區(qū)過(guò)大。
CLIENT LIST 命令中相關(guān)字段:
obl: 輸出緩沖區(qū)的長(zhǎng)度(字節(jié)為單位, 0 表示沒(méi)有分配輸出緩沖區(qū))
oll: 輸出列表包含的對(duì)象數(shù)量(當(dāng)輸出緩沖區(qū)沒(méi)有剩余空間時(shí),命令回復(fù)會(huì)以字符串對(duì)象的形式被入隊(duì)到這個(gè)隊(duì)列里)
omem: 輸出緩沖區(qū)和輸出列表占用的內(nèi)存總量
客戶端的存活狀態(tài)
age: 以秒計(jì)算的已連接時(shí)長(zhǎng)
idle: 最近一次(100ms 或者更長(zhǎng)時(shí)間)以秒計(jì)算的空閑時(shí)長(zhǎng)
客戶端類(lèi)型
flags: 客戶端 flag
客戶端 flag 可以由以下部分組成:
O: 客戶端是 MONITOR 模式下的附屬節(jié)點(diǎn)(slave)
S: 客戶端是一般模式下(normal)的附屬節(jié)點(diǎn)
M: 客戶端是主節(jié)點(diǎn)(master)
x: 客戶端正在執(zhí)行事務(wù)
b: 客戶端正在等待阻塞事件
i: 客戶端正在等待 VM I/O 操作(已廢棄)
d: 一個(gè)受監(jiān)視(watched)的鍵已被修改, EXEC 命令將失敗
c: 在將回復(fù)完整地寫(xiě)出之后,關(guān)閉鏈接
u: 客戶端未被阻塞(unblocked)
U: 通過(guò)Unix套接字連接的客戶端
r: 客戶端是只讀模式的集群節(jié)點(diǎn)
A: 盡可能快地關(guān)閉連接
N: 未設(shè)置任何 flag,普通客戶端
db: 該客戶端正在使用的數(shù)據(jù)庫(kù) ID
sub: 已訂閱頻道的數(shù)量
psub: 已訂閱模式的數(shù)量
multi: 在事務(wù)中被執(zhí)行的命令數(shù)量
events: 文件描述符事件
cmd: 最近一次執(zhí)行的命令
文件描述符事件可以是:
r: 客戶端套接字(在事件 loop 中)是可讀的(readable)
w: 客戶端套接字(在事件 loop 中)是可寫(xiě)的(writeable)
為了 debug 的需要,經(jīng)常會(huì)對(duì)域進(jìn)行添加和刪除。一個(gè)版本安全的 Redis 客戶端使用這個(gè)命令時(shí)應(yīng)該根據(jù)字段解析相應(yīng)內(nèi)容。(比如:處理未知的字段,應(yīng)跳過(guò)該字段)。
示例:
coderknock> CLIENT LIST # 連接時(shí)間 87 秒 空閑 87 秒 說(shuō)明該連接一直處于空閑狀態(tài) id=3 addr=127.0.0.1:55773 fd=8 name= age=87 idle=87 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=18446744073709537584 events=r cmd=command id=4 addr=127.0.0.1:55795 fd=7 name= age=58 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 #響應(yīng)緩沖區(qū)的長(zhǎng)度為0,回復(fù)列表有4869個(gè)對(duì)象,兩個(gè)部分共使用了133081288字節(jié)=126M id=7 addr=127.0.0.1:56358 fd=6 name= age=91 idle=0 flags=O db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=4869 omem=133081288 events=rw cmd=monitor獲取/設(shè)置名稱
CLIENT GETNAME
自2.6.9可用。
時(shí)間復(fù)雜度:O(1)。
語(yǔ)法:CLIENT GETNAME
說(shuō)明:
CLIENT GETNAME 返回當(dāng)前連接由CLIENT SETNAME設(shè)置的名字。如果沒(méi)有用CLIENT SETNAME設(shè)置名字,將返回一個(gè)空的回復(fù)。
返回值:
返回連接名字或者空(沒(méi)有設(shè)置名字時(shí))
示例:
coderknock> CLIENT GETNAME (nil) # 只針對(duì)當(dāng)前客戶端 coderknock> CLIENT SETNAME coderknock OK coderknock> CLIENT GETNAME "coderknock"CLIENT SETNAME
自2.6.9可用。
時(shí)間復(fù)雜度:O(1)。
語(yǔ)法:CLIENT SETNAME connection-name
說(shuō)明:
為當(dāng)前連接分配一個(gè)名字。
這個(gè)名字會(huì)顯示在 CLIENT LIST 命令的結(jié)果中, 用于識(shí)別當(dāng)前正在與服務(wù)器進(jìn)行連接的客戶端。
舉個(gè)例子, 在使用 Redis 構(gòu)建隊(duì)列(queue)時(shí), 可以根據(jù)連接負(fù)責(zé)的任務(wù)(role), 為信息生產(chǎn)者(producer)和信息消費(fèi)者(consumer)分別設(shè)置不同的名字。
名字使用 Redis 的字符串類(lèi)型來(lái)保存, 最大可以占用 512 MB 。 另外, 為了避免和 CLIENT LIST 命令的輸出格式發(fā)生沖突, 名字里不允許使用空格。
要移除一個(gè)連接的名字, 可以將連接的名字設(shè)為空字符串 "" 。
使用 CLIENT GETNAME 命令可以取出連接的名字。
新創(chuàng)建的連接默認(rèn)是沒(méi)有名字的。
在 Redis 應(yīng)用程序發(fā)生連接泄漏時(shí),為連接設(shè)置名字是一種很好的 debug 手段。
返回值:
設(shè)置成功時(shí)返回 OK 。
示例:
# 新連接默認(rèn)沒(méi)有名字coderknock> CLIENT GETNAME (nil)# 設(shè)置名字 coderknock> CLIENT SETNAME coderknock OK# 返回名字 coderknock> CLIENT GETNAME "coderknock"# 在客戶端列表中查看 coderknock> CLIENT LIST id=5 addr=127.0.0.1:49298 fd=8 name=coderknock age=173 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# 清除名字 coderknock> CLIENT SETNAME # 只用空格是不行的! (error) ERR Syntax error, try CLIENT (LIST | KILL ip:port) coderknock> CLIENT SETNAME "" # 必須雙引號(hào)顯示包圍 OK coderknock> CLIENT GETNAME (nil) coderknock> CLIENT LIST id=5 addr=127.0.0.1:49298 fd=8 name= age=203 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#別的客戶端同樣可以取名為 coderknock coderknock> CLIENT LIST id=6 addr=127.0.0.1:49438 fd=7 name=coderknock age=67 idle=32 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 id=7 addr=127.0.0.1:49454 fd=9 name=coderknock age=25 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在 Redis 只有一個(gè)應(yīng)用方使用的情況下,IP和端口作為標(biāo)識(shí)會(huì)更加清晰。當(dāng)多個(gè)應(yīng)用方共同使用一個(gè)Redis,那么此時(shí) CLIENT SETNAME 可以作為標(biāo)識(shí)客戶端的一個(gè)依據(jù)。
客戶端限制
maxclients timeout
在之前的 《Redis 配置》一文中我們講過(guò) CONFIG GET CONFIG_SETTING_NAME、CONFIG SET CONFIG_SETTING_NAME NEW_CONFIG_VALUE,命令,其中CONFIG GET/SET maxclients 用于獲取/設(shè)置客戶端最大連接數(shù),一旦連接數(shù)超過(guò) maxclients 新的連接將被拒絕,maxclients 默認(rèn)值是10000,可以通過(guò) INFO clients來(lái)查詢當(dāng)前Redis的連接數(shù):
# 查詢最大連接數(shù) coderknock> CONFIG GET maxclients 1) "maxclients" 2) "10000" coderknock> INFO clients # Clients connected_clients:1 #當(dāng)前連接客戶端數(shù) client_longest_output_list:0 client_biggest_input_buf:0 blocked_clients:0可以通過(guò) CONFIG SET maxclients 對(duì)最大客戶端連接數(shù)進(jìn)行動(dòng)態(tài)設(shè)置:
# 我們將 maxclients 設(shè)置小些 coderknock> CONFIG SET maxclients 2 OK coderknock> CONFIG GET maxclients 1) "maxclients" 2) "2" # 我們啟動(dòng)再啟動(dòng)兩個(gè)客戶端此時(shí)在第一個(gè)或第二個(gè)客戶端上執(zhí)行 coderknock> CLIENT LIST id=2 addr=127.0.0.1:51010 fd=7 name= age=386 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=3 addr=127.0.0.1:51091 fd=8 name= age=154 idle=126 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 obl=0 oll=0 omem=18446744073709537584 events=r cmd=keys # 在第三個(gè)啟動(dòng)的客戶端上進(jìn)行操作(命令窗口并沒(méi)有關(guān)閉所以還是可以執(zhí)行的) coderknock> keys * Error: 遠(yuǎn)程主機(jī)強(qiáng)迫關(guān)閉了一個(gè)現(xiàn)有的連接。 # 可以看到這個(gè)客戶端不能正常使用一般情況下 maxclients 默認(rèn)的 10000 大小已經(jīng)做夠使用了,但是有時(shí)由于使用不當(dāng)可能導(dǎo)致存在大量空閑連接(idle 較大的連接),無(wú)論是從網(wǎng)絡(luò)連接的成本還是超過(guò)maxclients的后果來(lái)說(shuō)都不是什么好事,因此 Redis 提供了 timeout (單位為秒)參數(shù)限制連接的最大空閑時(shí)間,一旦客戶端空閑時(shí)間超過(guò)了 timeout 設(shè)置,連接將會(huì)被關(guān)閉。使用 CONFIG GET/SET timeout 可以獲取設(shè)置 timeout:
# #Redis默認(rèn)的 timeout 是0,也就是沒(méi)有超時(shí)時(shí)間 coderknock> CONFIG GET timeout 1) "timeout" 2) "0"Redis的默認(rèn)配置給出的 timeout=0 ,在這種情況下客戶端基本不會(huì)出現(xiàn)上面的異常,這是基于對(duì)客戶端開(kāi)發(fā)的一種保護(hù)。如果客戶端設(shè)置了超時(shí),可能就會(huì)出現(xiàn)連接超時(shí)的異常,對(duì)應(yīng)用業(yè)務(wù)造成一定影響,但是如果 Redis 的客戶端使用不當(dāng)或者客戶端本身的一些問(wèn)題,造成沒(méi)有及時(shí)釋放客戶端連接,可能會(huì)造成大量的空閑連接占據(jù)著很多連接資源,一旦超過(guò) maxclients;后果也是不堪設(shè)想。所在在實(shí)際開(kāi)發(fā)和運(yùn)維中,需要將 timeout 設(shè)置成大于0 且較大的數(shù)字,例如可以設(shè)置為300秒,同時(shí)在客戶端使用上添加空閑檢測(cè)和驗(yàn)證等等措施。
關(guān)閉客戶端
CLINET KILL
自2.4.0可用。
時(shí)間復(fù)雜度:O(N) N是客戶端連接數(shù)量。
語(yǔ)法:CLIENT KILL [ip:port][ID client-id] [normal|slave|pubsub][ADDR ip:port][SKIPME yes/no]
說(shuō)明:
CLIENT KILL關(guān)閉一個(gè)指定的連接。在 Redis2.8.11 時(shí)可以根據(jù)客戶端地址關(guān)閉指定連接,關(guān)閉方式如下:
CLIENT KILL addr:port addr:port 應(yīng)該是 CLIENT LIST 命令里面列出的客戶端連接之一。
然而,從Redis 2.8.12開(kāi)始,這個(gè)命令改為如下格式:
CLIENT KILL <filter> <value> ... ... <filter> <value>
新的格式可以根據(jù)不同屬性殺死客戶端而不是只按地址殺死。他們有以下一些格式:
CLIENT KILL ADDR ip:port : 和舊版的三個(gè)參數(shù)時(shí)的行為完全一樣。
CLIENT KILL ID client-id : 可以通過(guò)唯一 ID 字段殺死一個(gè)客戶端,唯一 ID 可以通過(guò) Redis 2.8.12 開(kāi)始的 CLIENT LIST 命令查詢(之前版本可能沒(méi)有 ID 字段)。
CLIENT KILL TYPE type : 這里的 type 可以是 normal , slave , pubsub (Redis 3.2 版本之后增加了 master 類(lèi)型的支持)。 這將關(guān)閉所有特殊類(lèi)的客戶端。 請(qǐng)注意被認(rèn)為是屬于正常類(lèi)的客戶端將會(huì)被MONITOR 命令監(jiān)視到。
CLIENT KILL SKIPME yes/no:默認(rèn)情況下,該選項(xiàng)設(shè)置為yes ,即調(diào)用過(guò)該命令的客戶端將不會(huì)被殺死,將該選項(xiàng)設(shè)置為 no 即也會(huì)殺死調(diào)用過(guò)該命令的客戶端。
該命令支持同時(shí)使用多個(gè)過(guò)濾器,或殺死多個(gè)過(guò)濾器的合集。
由于Redis的單線程特性,在執(zhí)行命令時(shí)無(wú)法終止客戶端連接。從客戶端的角度來(lái)看,在執(zhí)行命令的過(guò)程中,連接永遠(yuǎn)不會(huì)被關(guān)閉。但是,只有當(dāng)下一個(gè)命令發(fā)送(并導(dǎo)致網(wǎng)絡(luò)錯(cuò)誤)時(shí),客戶端才會(huì)注意到連接已關(guān)閉。
返回值:
當(dāng)用三個(gè)參數(shù)格式調(diào)用時(shí):
如果連接存在并已關(guān)閉返回OK
當(dāng)使用過(guò)濾器/值格式調(diào)用時(shí):
客戶端數(shù)量被殺。
示例:
# 列出所有已連接客戶端coderknock> CLIENT LIST addr=127.0.0.1:43501 fd=5 age=10 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=client# 殺死當(dāng)前客戶端的連接coderknock> CLIENT KILL 127.0.0.1:43501 OK# 之前的連接已經(jīng)被關(guān)閉,CLI 客戶端又重新建立了連接 # 之前的端口是 43501 ,現(xiàn)在是 43504coderknock> CLIENT LIST addr=127.0.0.1:43504 fd=5 age=0 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=client由于一些原因(例如設(shè)置 timeout=0 時(shí)產(chǎn)生的長(zhǎng)時(shí)間空閑的客戶端),需要手動(dòng)殺掉客戶端連接時(shí),可以使用 CLIENT KILL 命令。
阻塞客戶端
CLIENT PAUSE
自2.9.5可用。
時(shí)間復(fù)雜度:O(1)。
語(yǔ)法:CLIENT PAUSE timeout
說(shuō)明:
CLIENT PAUSE 是一個(gè)連接控制命令,可以在指定的時(shí)間(以毫秒為單位)中掛起所有Redis客戶端。
該命令執(zhí)行以下操作:
只對(duì)普通和發(fā)布訂閱客戶端有效,對(duì)于主從復(fù)制(從節(jié)點(diǎn)內(nèi)部偽裝了一個(gè)客戶端)是無(wú)效的,也就是此期間主從復(fù)制是正常進(jìn)行的,所以此命令可以用來(lái)讓主從復(fù)制保持一致。
但是它盡可能地返回給調(diào)用者,因此 CLIENT PAUSE 命令的執(zhí)行不會(huì)自動(dòng)暫停(返回之后還是會(huì)暫停自身的客戶端)。
當(dāng)指定的時(shí)間量過(guò)去時(shí),所有客戶端都被解除阻塞:這將在暫停期間觸發(fā)對(duì)每個(gè)客戶端的查詢緩沖區(qū)中累積的所有命令的處理。
此命令非常有用,因?yàn)樗梢杂靡环N可控的方式將客戶端連接從一個(gè)Redis節(jié)點(diǎn)切換到另一個(gè)Redis節(jié)點(diǎn)。例如,在實(shí)例升級(jí)期間,系統(tǒng)管理員可以執(zhí)行以下操作:
使用 CLIENT PAUSE 暫??蛻?端
等待幾秒鐘以確保從站從主設(shè)備處理最新的復(fù)制流。
把一個(gè)從節(jié)點(diǎn)變成一個(gè)主節(jié)點(diǎn)。
重新配置客戶端以連接新的主節(jié)點(diǎn)。
可以將命令 暫停 發(fā)送到 MULTI / EXEC 塊 INFO replication 中,以便在客戶端被阻止時(shí)獲取當(dāng)前的主節(jié)點(diǎn)偏移量。這樣,可以在從屬端等待特定的偏移量,以確保處理所有的復(fù)制流。
Redis 3.2.10 / 4.0.0 中此命令還可以防止在客戶端暫停期間鍵被釋放或過(guò)期。這樣,數(shù)據(jù)集就被保證是靜態(tài)的,而不僅僅是從客戶端無(wú)法寫(xiě)入的角度來(lái)看,而且從內(nèi)部操作的角度來(lái)說(shuō)也是如此。
返回值:
如果超時(shí)無(wú)效,則該命令返回OK或錯(cuò)誤。
示例:
coderknock> CLIENT PAUSE 10000 OK coderknock> GET hello "world" (10.06s) # 這里可以看到查詢花費(fèi) 10s 的時(shí)間該命令在生產(chǎn)環(huán)境如要使用應(yīng)挑選操作較少時(shí),不然可能會(huì)引發(fā)不可預(yù)知的情況。
客戶端回復(fù)設(shè)定
CLIENT REPLY
自3.2.0可用。
時(shí)間復(fù)雜度:O(1)。
語(yǔ)法:CLIENT REPLY ON|OFF|SKIP
說(shuō)明:
有時(shí)客戶端可以完全禁用Redis服務(wù)器的回復(fù)
CLIENT REPLY 命令控制服務(wù)器是否會(huì)回復(fù)客戶端的命令。提供以下模式:
ON。這是默認(rèn)模式服務(wù)器返回每個(gè)命令的回復(fù)。
OFF。在此模式下,服務(wù)器將不會(huì)回復(fù)客戶端命令。
SKIP。此模式會(huì)立即跳過(guò)命令的回復(fù)。
返回值:
當(dāng)用 OFF 或 SKIP 命令調(diào)用時(shí),不作任何回復(fù)。調(diào)用時(shí)ON:返回OK。
該命令是新命令目前兼容客戶端較少
監(jiān)控
MONITOR
自1.0.0可用。
時(shí)間復(fù)雜度:不明確。
語(yǔ)法:MONITOR
說(shuō)明:
MONITOR 是一個(gè)調(diào)試命令,返回服務(wù)器處理的每一個(gè)命令,它能幫助我們了解在數(shù)據(jù)庫(kù)上發(fā)生了什么操作,可以通過(guò)redis-cli和telnet命令使用.
$ redis-cli monitor 1339518083.107412 [0 127.0.0.1:60866] "keys" "*" 1339518087.877697 [0 127.0.0.1:60866] "dbsize" 1339518090.420270 [0 127.0.0.1:60866] "set" "x" "6" 1339518096.506257 [0 127.0.0.1:60866] "get" "x" 1339518099.363765 [0 127.0.0.1:60866] "del" "x" 1339518100.544926 [0 127.0.0.1:60866] "get" "x"使用SIGINT (Ctrl-C)來(lái)停止 通過(guò)redis-cli使用 MONITOR 命令返回的輸出.
$ telnet localhost 6379 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. MONITOR +OK +1339518083.107412 [0 127.0.0.1:60866] "keys" "*" +1339518087.877697 [0 127.0.0.1:60866] "dbsize" +1339518090.420270 [0 127.0.0.1:60866] "set" "x" "6" +1339518096.506257 [0 127.0.0.1:60866] "get" "x" +1339518099.363765 [0 127.0.0.1:60866] "del" "x" +1339518100.544926 [0 127.0.0.1:60866] "get" "x" QUIT +OK Connection closed by foreign host.使用 QUIT 命令來(lái)停止通過(guò)telnet使用 MONITOR 返回的輸出.
MONITOR 性能消耗
由于 MONITOR 命令返回 服務(wù)器處理的所有的 命令, 所以在性能上會(huì)有一些消耗.
在不運(yùn)行 MONITOR 命令的情況下,benchmark的測(cè)試結(jié)果:
$ src/redis-benchmark -c 10 -n 100000 -q PING_INLINE: 101936.80 requests per second PING_BULK: 102880.66 requests per second SET: 95419.85 requests per second GET: 104275.29 requests per second INCR: 93283.58 requests per second在運(yùn)行 MONITOR 命令的情況下,benchmark的測(cè)試結(jié)果: (redis-cli monitor > /dev/null):
$ src/redis-benchmark -c 10 -n 100000 -q PING_INLINE: 58479.53 requests per second PING_BULK: 59136.61 requests per second SET: 41823.50 requests per second GET: 45330.91 requests per second INCR: 41771.09 requests per second在這種特定的情況下,運(yùn)行一個(gè) MONITOR 命令能夠降低50%的吞吐量,運(yùn)行多個(gè) MONITOR 命令 降低的吞吐量更多。
每個(gè)客戶端都有自己的輸出緩沖區(qū),既然 MONITOR 能監(jiān)聽(tīng)到所有的命令,一旦 Redis 的并發(fā)量過(guò)大 MONITOR 客戶端的輸出緩沖會(huì)暴漲,可能瞬間會(huì)占用大量?jī)?nèi)存。
返回值:
沒(méi)有統(tǒng)一標(biāo)準(zhǔn)的返回值, 無(wú)限的返回服務(wù)器端處理的命令流.或 key 不存在,返回 0 。
示例:
# 方式一 C:\Users\zylia>redis-cli -a admin123 monitor OK 1498547986.670236 [0 127.0.0.1:63859] "AUTH" "admin123" 1498547986.670366 [0 127.0.0.1:63859] "GET" "hello" 1498548024.414979 [0 127.0.0.1:63869] "AUTH" "admin123" 1498548024.415185 [0 127.0.0.1:63869] "COMMAND" 1498548046.317448 [0 127.0.0.1:63872] "AUTH" "admin123" 1498548046.317742 [0 127.0.0.1:63872] "COMMAND" #方式二 登錄后在進(jìn)行 coderknock> MONITOR OK 1498548046.317448 [0 127.0.0.1:63872] "AUTH" "admin123" 1498548046.317742 [0 127.0.0.1:63872] "COMMAND" #方式三 Telnet C:\Users\zylia>telnet 127.0.0.1 6379 auth admin123 +OK MONITOR +OK +1498548296.621530 [0 127.0.0.1:64068] "AUTH" "admin123" +1498548296.621658 [0 127.0.0.1:64068] "GET" "hello" # 支持同時(shí)開(kāi)啟多個(gè) MONITOR其他配置
tcp-keepalive:檢測(cè)TCP連接活性的周期,默認(rèn)值為0,也就是不進(jìn)行檢測(cè),如果需要設(shè)置,建議為60,那么Redis會(huì)每隔60秒對(duì)它創(chuàng)建的TCP連接進(jìn)行活性檢測(cè),防止大量死連接占用系統(tǒng)資源。
-
tcp-backlog:TCP 三次握手后,會(huì)將接受的連接放入隊(duì)列中,tcpbacklog就是隊(duì)列的大小,它在 Redis 中的默認(rèn)值是 511。通常來(lái)講這個(gè)參數(shù)不需要調(diào)整,但是這個(gè)參數(shù)會(huì)受到操作系統(tǒng)的影響,例如在Linux操作系統(tǒng)中,如果/proc/sys/net/core/somaxconn小于tcp-backlog,那么在Redis啟動(dòng)時(shí)會(huì)看到如下日志,并建議將/proc/sys/net/core/somaxconn設(shè)置更大。
WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/ sys/net/core/somaxconn is set to the lower value of 128.
修改方法也非常簡(jiǎn)單,只需要執(zhí)行如下命令:
echo 511 > /proc/sys/net/core/somaxconn源碼查看
我們來(lái)看下 Redis 源碼中客戶端部分的內(nèi)容:
typedef struct client {uint64_t id; /* Client incremental unique ID.客戶端增量惟一的ID */int fd; /* Client socket. 客戶端套接字*/redisDb *db; /* Pointer to currently SELECTed DB. 指向當(dāng)前選擇的DB的指針*/robj *name; /* As set by CLIENT SETNAME. 由客戶端 SETNAME命令設(shè)置*/sds querybuf; /* Buffer we use to accumulate client queries. 用來(lái)累積客戶端查詢的緩沖區(qū)*/sds pending_querybuf; /* If this is a master, this buffer represents theyet not applied replication stream that weare receiving from the master.如果這是一個(gè)主服務(wù)器 ,這個(gè)緩沖區(qū)表示我們從主服務(wù)器接收到的未應(yīng)用的復(fù)制流 */size_t querybuf_peak; /* Recent (100ms or more) peak of querybuf size.最近(100ms 或者更長(zhǎng)時(shí)間)querybuf 的峰值大小 */int argc; /* Num of arguments of current command. 當(dāng)前命令的參數(shù)個(gè)數(shù)*/robj **argv; /* Arguments of current command. 當(dāng)前命令的參數(shù)*/struct redisCommand *cmd, *lastcmd; /* Last command executed. 最后一個(gè)被執(zhí)行的命令*/int reqtype; /* Request protocol type: PROTO_REQ_* 請(qǐng)求協(xié)議類(lèi)型:PROTO_REQ_**/int multibulklen; /* Number of multi bulk arguments left to read. 讀取的多批量參數(shù)的數(shù)量*/long bulklen; /* Length of bulk argument in multi bulk request. 多批量請(qǐng)求的批量參數(shù)的長(zhǎng)度*/list *reply; /* List of reply objects to send to the client.發(fā)送給客戶端的應(yīng)答對(duì)象列表(回復(fù)列表 有的翻譯也叫動(dòng)態(tài)緩沖區(qū)) */unsigned long long reply_bytes; /* Tot bytes of objects in reply list. 對(duì)象個(gè)數(shù)(列表長(zhǎng)度)*/size_t sentlen; /* Amount of bytes already sent in the currentbuffer or object being sent. 在當(dāng)前的緩沖區(qū)或?qū)ο笠呀?jīng)發(fā)送的字節(jié)數(shù)*/time_t ctime; /* Client creation time. 客戶端創(chuàng)建時(shí)間*/time_t lastinteraction; /* Time of the last interaction, used for timeout 最后一次交互的時(shí)間,用于超時(shí) */time_t obuf_soft_limit_reached_time;int flags; /* Client flags: CLIENT_* macros. 客戶端標(biāo)志使用的是 CLIENT_* 宏指令(下面會(huì)列出)*/int authenticated; /* When requirepass is non-NULL. 當(dāng) requirepass 不是 null 時(shí)會(huì)為變量賦值*/int replstate; /* Replication state if this is a slave. 復(fù)制狀態(tài)如果這是一個(gè)從機(jī)*/int repl_put_online_on_ack; /* Install slave write handler on ACK. */int repldbfd; /* Replication DB file descriptor. */off_t repldboff; /* Replication DB file offset. */off_t repldbsize; /* Replication DB file size. */sds replpreamble; /* Replication DB preamble. */long long read_reploff; /* Read replication offset if this is a master. */long long reploff; /* Applied replication offset if this is a master. */long long repl_ack_off; /* Replication ack offset, if this is a slave. */long long repl_ack_time;/* Replication ack time, if this is a slave. */long long psync_initial_offset; /* FULLRESYNC reply offset other slavescopying this slave output buffershould use. */char replid[CONFIG_RUN_ID_SIZE+1]; /* Master replication ID (if master). */int slave_listening_port; /* As configured with: SLAVECONF listening-port */char slave_ip[NET_IP_STR_LEN]; /* Optionally given by REPLCONF ip-address */int slave_capa; /* Slave capabilities: SLAVE_CAPA_* bitwise OR. */multiState mstate; /* MULTI/EXEC state */int btype; /* Type of blocking op if CLIENT_BLOCKED. */blockingState bpop; /* blocking state */long long woff; /* Last write global replication offset. */list *watched_keys; /* Keys WATCHED for MULTI/EXEC CAS */dict *pubsub_channels; /* channels a client is interested in (SUBSCRIBE) */list *pubsub_patterns; /* patterns a client is interested in (SUBSCRIBE) */sds peerid; /* Cached peer ID. *//* Response buffer 響應(yīng)緩沖區(qū)(固定緩沖區(qū))*/int bufpos;// 字節(jié)數(shù)組作為響應(yīng)緩沖區(qū) 16K */char buf[PROTO_REPLY_CHUNK_BYTES];//#define PROTO_REPLY_CHUNK_BYTES (16*1024) /* 16k output buffer } client;Client flags
/* Client flags */ #define CLIENT_SLAVE (1<<0) /* This client is a slave server */ #define CLIENT_MASTER (1<<1) /* This client is a master server */ #define CLIENT_MONITOR (1<<2) /* This client is a slave monitor, see MONITOR */ #define CLIENT_MULTI (1<<3) /* This client is in a MULTI context */ #define CLIENT_BLOCKED (1<<4) /* The client is waiting in a blocking operation */ #define CLIENT_DIRTY_CAS (1<<5) /* Watched keys modified. EXEC will fail. */ #define CLIENT_CLOSE_AFTER_REPLY (1<<6) /* Close after writing entire reply. */ #define CLIENT_UNBLOCKED (1<<7) /* This client was unblocked and is stored inserver.unblocked_clients */ #define CLIENT_LUA (1<<8) /* This is a non connected client used by Lua */ #define CLIENT_ASKING (1<<9) /* Client issued the ASKING command */ #define CLIENT_CLOSE_ASAP (1<<10)/* Close this client ASAP */ #define CLIENT_UNIX_SOCKET (1<<11) /* Client connected via Unix domain socket */ #define CLIENT_DIRTY_EXEC (1<<12) /* EXEC will fail for errors while queueing */ #define CLIENT_MASTER_FORCE_REPLY (1<<13) /* Queue replies even if is master */ #define CLIENT_FORCE_AOF (1<<14) /* Force AOF propagation of current cmd. */ #define CLIENT_FORCE_REPL (1<<15) /* Force replication of current cmd. */ #define CLIENT_PRE_PSYNC (1<<16) /* Instance don't understand PSYNC. */ #define CLIENT_READONLY (1<<17) /* Cluster client is in read-only state. */ #define CLIENT_PUBSUB (1<<18) /* Client is in Pub/Sub mode. */ #define CLIENT_PREVENT_AOF_PROP (1<<19) /* Don't propagate to AOF. */ #define CLIENT_PREVENT_REPL_PROP (1<<20) /* Don't propagate to slaves. */ #define CLIENT_PREVENT_PROP (CLIENT_PREVENT_AOF_PROP|CLIENT_PREVENT_REPL_PROP) #define CLIENT_PENDING_WRITE (1<<21) /* Client has output to send but a writehandler is yet not installed. */ #define CLIENT_REPLY_OFF (1<<22) /* Don't send replies to client. */ #define CLIENT_REPLY_SKIP_NEXT (1<<23) /* Set CLIENT_REPLY_SKIP for next cmd */ #define CLIENT_REPLY_SKIP (1<<24) /* Don't send just this reply. */ #define CLIENT_LUA_DEBUG (1<<25) /* Run EVAL in debug mode. */ #define CLIENT_LUA_DEBUG_SYNC (1<<26) /* EVAL debugging without fork() */ #define CLIENT_MODULE (1<<27) /* Non connected client used by some module. */INFO
INFO
自1.0.0可用。
時(shí)間復(fù)雜度:O(1)。
語(yǔ)法:INFO [section]
說(shuō)明:
INFO命令以一種易于理解和閱讀的格式,返回關(guān)于Redis服務(wù)器的各種信息和統(tǒng)計(jì)數(shù)值。
通過(guò)給定可選的參數(shù) section ,可以讓命令只返回某一部分的信息:
server: Redis服務(wù)器的一般信息
clients: 客戶端的連接部分
memory: 內(nèi)存消耗相關(guān)信息
persistence: RDB和AOF相關(guān)信息
stats: 一般統(tǒng)計(jì)
replication: 主/從復(fù)制信息
cpu: 統(tǒng)計(jì)CPU的消耗
commandstats: Redis命令統(tǒng)計(jì)
cluster: Redis集群信息
keyspace: 數(shù)據(jù)庫(kù)的相關(guān)統(tǒng)計(jì)
它也可以采取以下值:
all: 返回所有信息
default: 值返回默認(rèn)設(shè)置的信息
如果沒(méi)有使用任何參數(shù)時(shí),默認(rèn)為default。
請(qǐng)注意不同Redis版本會(huì)添加或者刪除一些字段。一個(gè)健壯的客戶端應(yīng)用解析該命令的結(jié)果時(shí),應(yīng)該跳過(guò)未知的字段,并且優(yōu)雅的處理缺少的字段。
已下描述要求 Redis >= 2.4
下面是所有 server (記錄了 Redis 服務(wù)器的信息)相關(guān)的信息:
redis_version: Redis 服務(wù)器版本
redis_git_sha1: Git SHA1
redis_git_dirty: Git dirty flag
os: Redis 服務(wù)器的宿主操作系統(tǒng)
arch_bits: 架構(gòu)(32 或 64 位)
multiplexing_api: Redis 所使用的事件處理機(jī)制
gcc_version: 編譯 Redis 時(shí)所使用的 GCC 版本
process_id: 服務(wù)器進(jìn)程的 PID
run_id: Redis 服務(wù)器的隨機(jī)標(biāo)識(shí)符(用于 Sentinel 和集群)
tcp_port: TCP/IP 監(jiān)聽(tīng)端口
uptime_in_seconds: 自 Redis 服務(wù)器啟動(dòng)以來(lái),經(jīng)過(guò)的秒數(shù)
uptime_in_days: 自 Redis 服務(wù)器啟動(dòng)以來(lái),經(jīng)過(guò)的天數(shù)
lru_clock: 以分鐘為單位進(jìn)行自增的時(shí)鐘,用于 LRU 管理
下面是所有 clients(記錄了已連接客戶端的信息) 相關(guān)的信息:
connected_clients: 已連接客戶端的數(shù)量(不包括通過(guò)從屬服務(wù)器連接的客戶端)
client_longest_output_list: 當(dāng)前連接的客戶端當(dāng)中,最長(zhǎng)的輸出列表
client_biggest_input_buf: 當(dāng)前連接的客戶端當(dāng)中,最大輸入緩存
blocked_clients: 正在等待阻塞命令(BLPOP、BRPOP、BRPOPLPUSH)的客戶端的數(shù)量
下面是所有 memory (記錄了服務(wù)器的內(nèi)存信息)相關(guān)的信息:
used_memory: 由 Redis 分配器分配的內(nèi)存總量,以字節(jié)(byte)為單位
used_memory_human: 以人類(lèi)可讀的格式返回 Redis 分配的內(nèi)存總量
used_memory_rss: 從操作系統(tǒng)的角度,返回 Redis 已分配的內(nèi)存總量(俗稱常駐集大小)。這個(gè)值和 top 、 ps 等命令的輸出一致。
used_memory_peak: Redis 的內(nèi)存消耗峰值(以字節(jié)為單位)
used_memory_peak_human: 以人類(lèi)可讀的格式返回 Redis 的內(nèi)存消耗峰值
used_memory_lua: Lua 引擎所使用的內(nèi)存大小(以字節(jié)為單位)
mem_fragmentation_ratio: used_memory_rss 和 used_memory 之間的比率
mem_allocator: 在編譯時(shí)指定的, Redis 所使用的內(nèi)存分配器。可以是 libc 、 jemalloc 或者 tcmalloc 。 在理想情況下, used_memory_rss 的值應(yīng)該只比 used_memory 稍微高一點(diǎn)兒。
當(dāng) rss > used ,且兩者的值相差較大時(shí),表示存在(內(nèi)部或外部的)內(nèi)存碎片。
內(nèi)存碎片的比率可以通過(guò) mem_fragmentation_ratio 的值看出。
當(dāng) used > rss 時(shí),表示 Redis 的部分內(nèi)存被操作系統(tǒng)換出到交換空間了,在這種情況下,操作可能會(huì)產(chǎn)生明顯的延遲。
由于Redis無(wú)法控制其分配如何被映射到內(nèi)存頁(yè)面,因此較高的 usedmemoryrss 通常是內(nèi)存使用量激增的結(jié)果。
當(dāng) Redis 釋放內(nèi)存時(shí),分配器可能會(huì),也可能不會(huì),將內(nèi)存返還給操作系統(tǒng)。
如果 Redis 釋放了內(nèi)存,卻沒(méi)有將內(nèi)存返還給操作系統(tǒng),那么 used_memory 的值可能和操作系統(tǒng)顯示的 Redis 內(nèi)存占用并不一致。
查看 used_memory_peak 的值可以驗(yàn)證這種情況是否發(fā)生。
下面是所有 persistence (記錄了跟 RDB 持久化和 AOF 持久化有關(guān)的信息)相關(guān)的信息:
loading : 一個(gè)標(biāo)志值,記錄了服務(wù)器是否正在載入持久化文件。
rdb_changes_since_last_save : 距離最近一次成功創(chuàng)建持久化文件之后,經(jīng)過(guò)了多少秒。
rdb_bgsave_in_progress : 一個(gè)標(biāo)志值,記錄了服務(wù)器是否正在創(chuàng)建 RDB 文件。
rdb_last_save_time : 最近一次成功創(chuàng)建 RDB 文件的 UNIX 時(shí)間戳。
rdb_last_bgsave_status : 一個(gè)標(biāo)志值,記錄了最近一次創(chuàng)建 RDB 文件的結(jié)果是成功還是失敗。
rdb_last_bgsave_time_sec : 記錄了最近一次創(chuàng)建 RDB 文件耗費(fèi)的秒數(shù)。
rdb_current_bgsave_time_sec : 如果服務(wù)器正在創(chuàng)建 RDB 文件,那么這個(gè)域記錄的就是當(dāng)前的創(chuàng)建操作已經(jīng)耗費(fèi)的秒數(shù)。
aof_enabled : 一個(gè)標(biāo)志值,記錄了 AOF 是否處于打開(kāi)狀態(tài)。
aof_rewrite_in_progress : 一個(gè)標(biāo)志值,記錄了服務(wù)器是否正在創(chuàng)建 AOF 文件。
aof_rewrite_scheduled : 一個(gè)標(biāo)志值,記錄了在 RDB 文件創(chuàng)建完畢之后,是否需要執(zhí)行預(yù)約的 AOF 重寫(xiě)操作。
aof_last_rewrite_time_sec : 最近一次創(chuàng)建 AOF 文件耗費(fèi)的時(shí)長(zhǎng)。
aof_current_rewrite_time_sec : 如果服務(wù)器正在創(chuàng)建 AOF 文件,那么這個(gè)域記錄的就是當(dāng)前的創(chuàng)建操作已經(jīng)耗費(fèi)的秒數(shù)。
aof_last_bgrewrite_status : 一個(gè)標(biāo)志值,記錄了最近一次創(chuàng)建 AOF 文件的結(jié)果是成功還是失敗。
如果 AOF 持久化功能處于開(kāi)啟狀態(tài),那么這個(gè)部分還會(huì)加上以下字段:
aof_current_size : AOF 文件目前的大小。
aof_base_size : 服務(wù)器啟動(dòng)時(shí)或者 AOF 重寫(xiě)最近一次執(zhí)行之后,AOF 文件的大小。
aof_pending_rewrite : 一個(gè)標(biāo)志值,記錄了是否有 AOF 重寫(xiě)操作在等待 RDB 文件創(chuàng)建完畢之后執(zhí)行。
aof_buffer_length : AOF 緩沖區(qū)的大小。
aof_rewrite_buffer_length : AOF 重寫(xiě)緩沖區(qū)的大小。
aof_pending_bio_fsync : 后臺(tái) I/O 隊(duì)列里面,等待執(zhí)行的 fsync 調(diào)用數(shù)量。
aof_delayed_fsync : 被延遲的 fsync 調(diào)用數(shù)量。
If a load operation is on-going, these additional fields will be added:
loading_start_time: Epoch-based timestamp of the start of the load operation
loading_total_bytes: Total file size
loading_loaded_bytes: Number of bytes already loaded
loading_loaded_perc: Same value expressed as a percentage
loading_eta_seconds: ETA in seconds for the load to be complete
下面是所有 stats(記錄了一般統(tǒng)計(jì)信息)相關(guān)的信息:
total_connections_received : 服務(wù)器已接受的連接請(qǐng)求數(shù)量。
total_commands_processed : 服務(wù)器已執(zhí)行的命令數(shù)量。
instantaneous_ops_per_sec : 服務(wù)器每秒鐘執(zhí)行的命令數(shù)量。
rejected_connections : 因?yàn)樽畲罂蛻舳藬?shù)量限制而被拒絕的連接請(qǐng)求數(shù)量。
expired_keys : 因?yàn)檫^(guò)期而被自動(dòng)刪除的數(shù)據(jù)庫(kù)鍵數(shù)量。
evicted_keys : 因?yàn)樽畲髢?nèi)存容量限制而被驅(qū)逐(evict)的鍵數(shù)量。
keyspace_hits : 查找數(shù)據(jù)庫(kù)鍵成功的次數(shù)。
keyspace_misses : 查找數(shù)據(jù)庫(kù)鍵失敗的次數(shù)。
pubsub_channels : 目前被訂閱的頻道數(shù)量。
pubsub_patterns : 目前被訂閱的模式數(shù)量。
latest_fork_usec : 最近一次 fork() 操作耗費(fèi)的毫秒數(shù)。
下面是所有 replication(主/從復(fù)制信息) 相關(guān)的信息:
role : 如果當(dāng)前服務(wù)器沒(méi)有在復(fù)制任何其他服務(wù)器,那么這個(gè)域的值就是 master ;否則的話,這個(gè)域的值就是 slave。注意,在創(chuàng)建復(fù)制鏈的時(shí)候,一個(gè)從服務(wù)器也可能是另一個(gè)服務(wù)器的主服務(wù)器。
如果當(dāng)前服務(wù)器是一個(gè)從服務(wù)器的話,那么這個(gè)部分還會(huì)加上以下字段:
master_host : 主服務(wù)器的 IP 地址。
master_port : 主服務(wù)器的 TCP 監(jiān)聽(tīng)端口號(hào)。
master_link_status : 復(fù)制連接當(dāng)前的狀態(tài), up 表示連接正常, down 表示連接斷開(kāi)。
master_last_io_seconds_ago : 距離最近一次與主服務(wù)器進(jìn)行通信已經(jīng)過(guò)去了多少秒鐘。
master_sync_in_progress : 一個(gè)標(biāo)志值,記錄了主服務(wù)器是否正在與這個(gè)從服務(wù)器進(jìn)行同步。
如果同步操作正在進(jìn)行,那么這個(gè)部分還會(huì)加上以下字段:
master_sync_left_bytes : 距離同步完成還缺少多少字節(jié)數(shù)據(jù)。
master_sync_last_io_seconds_ago : 距離最近一次因?yàn)?SYNC 操作而進(jìn)行 I/O 已經(jīng)過(guò)去了多少秒。
如果主從服務(wù)器之間的連接處于斷線狀態(tài),那么這個(gè)部分還會(huì)加上以下字段:
master_link_down_since_seconds : 主從服務(wù)器連接斷開(kāi)了多少秒。
以下是一些總會(huì)出現(xiàn)的字段:
connected_slaves : 已連接的從服務(wù)器數(shù)量。
對(duì)于每個(gè)從服務(wù)器,都會(huì)添加以下一行信息:
slaveXXX : ID、IP 地址、端口號(hào)、連接狀態(tài)
下面是所有 cpu 相關(guān)的信息:
used_cpu_sys : Redis 服務(wù)器耗費(fèi)的系統(tǒng) CPU 。
used_cpu_user : Redis 服務(wù)器耗費(fèi)的用戶 CPU 。
used_cpu_sys_children : 后臺(tái)進(jìn)程耗費(fèi)的系統(tǒng) CPU 。
used_cpu_user_children : 后臺(tái)進(jìn)程耗費(fèi)的用戶 CPU 。
-
commandstats 部分記錄了各種不同類(lèi)型的命令的執(zhí)行統(tǒng)計(jì)信息,比如命令執(zhí)行的次數(shù)、命令耗費(fèi)的 CPU 時(shí)間、執(zhí)行每個(gè)命令耗費(fèi)的平均 CPU 時(shí)間等等。對(duì)于每種類(lèi)型的命令,這個(gè)部分都會(huì)添加一行以下格式的信息:
cmdstat_XXX:calls=XXX,usec=XXX,usecpercall=XXX
-
cluster 部分記錄了和集群有關(guān)的信息,它包含以下域:
cluster_enabled : 一個(gè)標(biāo)志值,記錄集群功能是否已經(jīng)開(kāi)啟。
-
keyspace 部分記錄了數(shù)據(jù)庫(kù)相關(guān)的統(tǒng)計(jì)信息,比如數(shù)據(jù)庫(kù)的鍵數(shù)量、數(shù)據(jù)庫(kù)已經(jīng)被刪除的過(guò)期鍵數(shù)量等。對(duì)于每個(gè)數(shù)據(jù)庫(kù),這個(gè)部分都會(huì)添加一行以下格式的信息:
dbXXX:keys=XXX,expires=XXX
除上面給出的這些值以外, section 參數(shù)的值還可以是下面這兩個(gè):
all : 返回所有信息
default : 返回默認(rèn)選擇的信息
返回值:
具體請(qǐng)參見(jiàn)下面的測(cè)試代碼。
示例:
coderknock> INFO # Server redis_version:3.2.100 redis_git_sha1:00000000 redis_git_dirty:0 redis_build_id:dd26f1f93c5130ee redis_mode:standalone os:Windows arch_bits:64 multiplexing_api:WinSock_IOCP process_id:19944 run_id:472a23ff45a04eb3081b48078a0c619c26376ddf tcp_port:6379 uptime_in_seconds:268 uptime_in_days:0 hz:10 lru_clock:5378046 executable:D:\redis\redis-server.exe config_file:D:\redis\redis.windows.conf# Clients connected_clients:1 client_longest_output_list:0 client_biggest_input_buf:0 blocked_clients:0# Memory used_memory:711792 used_memory_human:695.11K used_memory_rss:674008 used_memory_rss_human:658.21K used_memory_peak:787952 used_memory_peak_human:769.48K total_system_memory:0 total_system_memory_human:0B used_memory_lua:37888 used_memory_lua_human:37.00K maxmemory:0 maxmemory_human:0B maxmemory_policy:noeviction mem_fragmentation_ratio:0.95 mem_allocator:jemalloc-3.6.0# Persistence loading:0 rdb_changes_since_last_save:0 rdb_bgsave_in_progress:0 rdb_last_save_time:1498550002 rdb_last_bgsave_status:ok rdb_last_bgsave_time_sec:-1 rdb_current_bgsave_time_sec:-1 aof_enabled:0 aof_rewrite_in_progress:0 aof_rewrite_scheduled:0 aof_last_rewrite_time_sec:-1 aof_current_rewrite_time_sec:-1 aof_last_bgrewrite_status:ok aof_last_write_status:ok# Stats total_connections_received:2 total_commands_processed:6 instantaneous_ops_per_sec:0 total_net_input_bytes:165 total_net_output_bytes:11895644 instantaneous_input_kbps:0.02 instantaneous_output_kbps:2286.67 rejected_connections:0 sync_full:0 sync_partial_ok:0 sync_partial_err:0 expired_keys:0 evicted_keys:0 keyspace_hits:1 keyspace_misses:0 pubsub_channels:0 pubsub_patterns:0 latest_fork_usec:0 migrate_cached_sockets:0# Replication role:master connected_slaves:0 master_repl_offset:0 repl_backlog_active:0 repl_backlog_size:1048576 repl_backlog_first_byte_offset:0 repl_backlog_histlen:0# CPU used_cpu_sys:0.20 used_cpu_user:0.11 used_cpu_sys_children:0.00 used_cpu_user_children:0.00# Cluster cluster_enabled:0# Keyspace db0:keys=43,expires=0,avg_ttl=0 db1:keys=3,expires=0,avg_ttl=0我是廣告
本人的直播課程在 7 月份就要開(kāi)始了,希望小伙伴們支持一下,現(xiàn)在報(bào)名有優(yōu)惠噢
https://segmentfault.com/l/15...
https://segmentfault.com/l/15...
總結(jié)
以上是生活随笔為你收集整理的Redis 服务器管理相关命令的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 反射常用API
- 下一篇: linux cmake编译源码,linu