- 工信部備案號 滇ICP備05000110號-1
- 滇公安備案 滇53010302000111
- 增值電信業(yè)務經(jīng)營許可證 B1.B2-20181647、滇B1.B2-20190004
- 云南互聯(lián)網(wǎng)協(xié)會理事單位
- 安全聯(lián)盟認證網(wǎng)站身份V標記
- 域名注冊服務機構許可:滇D3-20230001
- 代理域名注冊服務機構:新網(wǎng)數(shù)碼
慢查詢日志
記錄最新的N條執(zhí)行時間超過M毫秒的命令。慢查詢日志保存在內存中,而不是文件中,這保證了慢查詢日志的效率。
1.慢查詢日志的條目定義
/* This structure defines an entry inside the slow log list */ /* * 慢查詢日志 */ typedef struct slowlogEntry { // 命令與命令參數(shù) robj **argv; // 命令與命令參數(shù)的數(shù)量 int argc; // 唯一標識符 long long id; /* Unique entry identifier. */ // 執(zhí)行命令消耗的時間,以微秒為單位 // 注釋里說的 nanoseconds 是錯誤的 long long duration; /* Time spent by the query, in nanoseconds. */ // 命令執(zhí)行時的時間,格式為 UNIX 時間戳 time_t time; /* Unix time at which the query was executed. */ } slowlogEntry;
2.服務器和慢查詢有關的定義
/* slowlog */ // 保存了所有慢查詢日志的鏈表 list *slowlog; /* SLOWLOG list of commands */ // 下一條慢查詢日志的 ID long long slowlog_entry_id; /* SLOWLOG current entry ID */ // 服務器配置 slowlog-log-slower-than 選項的值 long long slowlog_log_slower_than; /* SLOWLOG time limit (to get logged) */ // 服務器配置 slowlog-max-len 選項的值 unsigned long slowlog_max_len; /* SLOWLOG max number of items logged */
服務器的慢查詢存儲在一個list中,list中的每一項都是一條慢查詢日志,較新的日志總是保存在隊首。慢查詢日志中保存命令的執(zhí)行參數(shù)和執(zhí)行時間,如果超出系統(tǒng)限制,參數(shù)和日志可能被截斷。
3.慢查詢支持的客戶端操作
GET:獲取某條或者全部慢查詢日志
RESET:清空慢查詢日志
LEN:慢查詢日志的數(shù)量
4.慢查詢日志的應用
redis每執(zhí)行一條命令,就會記錄命令的開始時間和結束時間,由此計算命令的執(zhí)行時間。并發(fā)命令以及命令的執(zhí)行時間傳遞給slowlogPushEntryIfNeeded,由slowlogPushEntryIfNeeded決定是否生成慢查詢日志。
/* Call() is the core of Redis execution of a command */ // 調用命令的實現(xiàn)函數(shù),執(zhí)行命令 void call(redisClient *c, int flags) { //獲取命令的執(zhí)行時間 /* Log the command into the Slow log if needed, and populate the * per-command statistics that we show in INFO commandstats. */ // 如果有需要,將命令放到 SLOWLOG 里面 if (flags & REDIS_CALL_SLOWLOG && c->cmd->proc != execCommand) slowlogPushEntryIfNeeded(c->argv,c->argc,duration); } 5.slowlogPushEntryIfNeeded的實現(xiàn) 判斷系統(tǒng)標志位,并把慢查詢日志加入到服務器的慢查詢鏈表中 /* Push a new entry into the slow log. * * 如果參數(shù) duration 超過服務器設置的上限時間, * 那么將一個新條目以 FIFO 順序推入到慢查詢日志中。 * * This function will make sure to trim the slow log accordingly to the * configured max length. * * 根據(jù)服務器設置的最大日志長度,可能會對日志進行截斷(trim) */ void slowlogPushEntryIfNeeded(robj **argv, int argc, long long duration) { // 慢查詢功能未開啟,直接返回 if (server.slowlog_log_slower_than < 0) return; /* Slowlog disabled */ // 如果執(zhí)行時間超過服務器設置的上限,那么將命令添加到慢查詢日志 if (duration >= server.slowlog_log_slower_than) // 新日志添加到鏈表表頭 listAddNodeHead(server.slowlog,slowlogCreateEntry(argv,argc,duration)); /* Remove old entries if needed. */ // 如果日志數(shù)量過多,那么進行刪除 while (listLength(server.slowlog) > server.slowlog_max_len) listDelNode(server.slowlog,listLast(server.slowlog)); }
提交成功!非常感謝您的反饋,我們會繼續(xù)努力做到更好!
這條文檔是否有幫助解決問題?
售前咨詢
售后咨詢
備案咨詢
二維碼
TOP