W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗(yàn)值獎勵
在每次執(zhí)行命令的之前和之后, 程序都會記錄微秒格式的當(dāng)前 UNIX 時間戳, 這兩個時間戳之間的差就是服務(wù)器執(zhí)行命令所耗費(fèi)的時長, 服務(wù)器會將這個時長作為參數(shù)之一傳給 slowlogPushEntryIfNeeded
函數(shù), 而 slowlogPushEntryIfNeeded
函數(shù)則負(fù)責(zé)檢查是否需要為這次執(zhí)行的命令創(chuàng)建慢查詢?nèi)罩荆?以下偽代碼展示了這一過程:
# 記錄執(zhí)行命令前的時間
before = unixtime_now_in_us()
# 執(zhí)行命令
execute_command(argv, argc, client)
# 記錄執(zhí)行命令后的時間
after = unixtime_now_in_us()
# 檢查是否需要創(chuàng)建新的慢查詢?nèi)罩?slowlogPushEntryIfNeeded(argv, argc, before-after)
slowlogPushEntryIfNeeded
函數(shù)的作用有兩個:
slowlog-log-slower-than
選項(xiàng)所設(shè)置的時間, 如果是的話, 就為命令創(chuàng)建一個新的日志, 并將新日志添加到 slowlog
鏈表的表頭。slowlog-max-len
選項(xiàng)所設(shè)置的長度, 如果是的話, 那么將多出來的日志從 slowlog
鏈表中刪除掉。以下是 slowlogPushEntryIfNeeded
函數(shù)的實(shí)現(xiàn)代碼:
void slowlogPushEntryIfNeeded(robj **argv, int argc, long long duration) {
// 慢查詢功能未開啟,直接返回
if (server.slowlog_log_slower_than < 0) return;
// 如果執(zhí)行時間超過服務(wù)器設(shè)置的上限,那么將命令添加到慢查詢?nèi)罩? if (duration >= server.slowlog_log_slower_than)
// 新日志添加到鏈表表頭
listAddNodeHead(server.slowlog,slowlogCreateEntry(argv,argc,duration));
// 如果日志數(shù)量過多,那么進(jìn)行刪除
while (listLength(server.slowlog) > server.slowlog_max_len)
listDelNode(server.slowlog,listLast(server.slowlog));
}
函數(shù)中的大部分代碼我們已經(jīng)介紹過了, 唯一需要說明的是 slowlogCreateEntry
函數(shù): 該函數(shù)根據(jù)傳入的參數(shù), 創(chuàng)建一個新的慢查詢?nèi)罩荆?并將 redisServer.slowlog_entry_id
的值增一。
舉個例子, 假設(shè)服務(wù)器當(dāng)前保存的慢查詢?nèi)罩救鐖D 23-2 所示, 如果我們執(zhí)行以下命令:
redis> EXPIRE msg 10086
(integer) 1
服務(wù)器在執(zhí)行完這個 EXPIRE 命令之后, 就會調(diào)用 slowlogPushEntryIfNeeded
函數(shù), 函數(shù)將為 EXPIRE 命令創(chuàng)建一條 id
為 6
的慢查詢?nèi)罩荆?并將這條新日志添加到 slowlog
鏈表的表頭, 如圖 23-3 所示。
注意, 除了 slowlog
鏈表發(fā)生了變化之外, slowlog_entry_id
的值也從 6
變?yōu)?nbsp;7
了。
之后, slowlogPushEntryIfNeeded
函數(shù)發(fā)現(xiàn), 服務(wù)器設(shè)定的最大慢查詢?nèi)罩緮?shù)目為 5
條, 而服務(wù)器目前保存的慢查詢?nèi)罩緮?shù)目為 6
條, 于是服務(wù)器將 id
為 1
的慢查詢?nèi)罩緞h除, 讓服務(wù)器的慢查詢?nèi)罩緮?shù)量回到設(shè)定好的 5
條。
刪除操作執(zhí)行之后的服務(wù)器狀態(tài)如圖 23-4 所示。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: