慢查詢日志是 Redis 提供的一個用于觀察系統(tǒng)性能的功能,這個功能的實現非常簡單,這里我們也簡單地講解一下。
本章先介紹和慢查詢功能相關的數據結構和變量,然后介紹 Redis 是如何記錄命令的執(zhí)行時間,以及如何為執(zhí)行超過限制事件的命令記錄慢查詢日志的。
每條慢查詢日志都以一個 slowlog.h/slowlogEntry
結構定義:
typedef struct slowlogEntry {
// 命令參數
robj **argv;
// 命令參數數量
int argc;
// 唯一標識符
long long id; /* Unique entry identifier. */
// 執(zhí)行命令消耗的時間,以納秒(1 / 1,000,000,000 秒)為單位
long long duration; /* Time spent by the query, in nanoseconds. */
// 命令執(zhí)行時的時間
time_t time; /* Unix time at which the query was executed. */
} slowlogEntry;
記錄服務器狀態(tài)的 redis.h/redisServer
結構里保存了幾個和慢查詢有關的屬性:
struct redisServer {
// ... other fields
// 保存慢查詢日志的鏈表
list *slowlog; /* SLOWLOG list of commands */
// 慢查詢日志的當前 id 值
long long slowlog_entry_id; /* SLOWLOG current entry ID */
// 慢查詢時間限制
long long slowlog_log_slower_than; /* SLOWLOG time limit (to get logged) */
// 慢查詢日志的最大條目數量
unsigned long slowlog_max_len; /* SLOWLOG max number of items logged */
// ... other fields
};
slowlog
屬性是一個鏈表,鏈表里的每個節(jié)點保存了一個慢查詢日志結構,所有日志按添加時間從新到舊排序,新的日志在鏈表的左端,舊的日志在鏈表的右端。
slowlog_entry_id
在創(chuàng)建每條新的慢查詢日志時增一,用于產生慢查詢日志的 ID (這個 ID 在執(zhí)行 SLOWLOG RESET
之后會被重置)。
slowlog_log_slower_than
是用戶指定的命令執(zhí)行時間上限,執(zhí)行時間大于等于這個值的命令會被慢查詢日志記錄。
slowlog_max_len
慢查詢日志的最大數量,當日志數量等于這個值時,添加一條新日志會造成最舊的一條日志被刪除。
下圖展示了一個 slowlog
屬性的實例:
更多建議: