慢查询日志
慢查询日志功能用于记录执行时间超过给定时间的命令,帮助用户监视和优化查询速度。
// slowlogEntry 慢查询日志记录结构
typedef struct slowlogEntry {
// 日志唯一标识符 ID
long long id;
// 命令执行的时间,UNIX 时间戳
time_t time;
// 命令执行所消耗的时间,单位:微秒
long long duration;
// 命令参数
robj **argv;
// 命令参数数量
int argc;
} slowlogEntry;
// redis服务器结构
struct redisServer {
// ...
// 下一条慢查询日志 ID,初始值 0,每当有新记录产生时,值递增 1
long long slowlog_entry_id;
// 所有慢查询日志的链表,保存的是 slowlogEntry 结构
list *slowlog;
// 服务器配置(redis.conf),慢查询日志时间
long long slowlog_log_slower_than;
// 服务器配置(redis.conf),慢查询日志保存记录数
unsigned long slowlog_max_len;
// ...
};
配置
slowlog-log-slower-than
定义:当命令执行的时间超过 slowlog-log-slower-than 指定的值,则此命令将被记录到慢查询日志中。
单位:微秒(一秒 = 1 000 000 微秒)。
slowlog-max-len
定义:最多保存的慢查询日志记录数。
实现:慢查询日志记录数等于 slowlog-max-len 时,服务器在添加一条新的慢查询日志时,先删除最旧的那条慢查询日志(日志队列,FIFO)。
slowlog get 命令
查看服务器所报存的慢查询日志。
重点
- Redis 的慢查询日志功能用于记录执行的时间长度超过指定时间的命令。
- Redis 将所有的慢查询日志保存在服务器结构 redisServer 的 slowlog 链表中,每个链表节点包含一个 slowlogEntry 结构,每个 slowlogEntry 结构代表一个慢查询日志。
- 通过遍历 redisServer 结构的 slowlog 链表实现打印和删除日志功能。
- 慢查询日志的数量等于服务器保存的 slowlog 链表的长度。
- 新的慢查询日志会被添加到 slowlog 链表头,如果日志数量超过 slowlog-max-len,slowlog 链表尾的日志将被删除。