Redis慢查询日志功能用于记录执行时间超过给定时长的命令请求, 用户可以通过这个功能产生的日志来监视和优化查询速度。
相关配置参数
-
slowlog-log-slower-than选项指定执行时间超过多少微秒(1秒等于1000000微秒)的请求会被记录到日志上面 -
slowlog-max-len选项指定服务器最多保存多少条慢查询日志
服务器使用先进先出的方式保存多条慢查询日志, 当服务器存储的慢查询日志数量等于slowlog-max-len选项的值时, 服务器在添加一条新的慢查询日志之前, 会先将最旧的一条慢查询日志删除.
可以通过CONFIG SET的方式设置redis的配置信息:
redis> CONFIG SET slowlog-log-slower-than 0 redis> CONFIG SET slowlog-max-len 5
慢查询记录的保存
服务器状态中包含了几个和慢查询日志功能有关的属性:
struct redisServer {
// 下一条慢查询日志的ID
long long slowlog_entry_id;
// 保存了所有慢查询日志的链表
list *slowlog;
// 服务器配置``slowlog-log-slower-than``选项的值
long long slowlog_log_slower_than;
// 服务器配置``slowlog-max-len``选项的值
unsigned long slowlog_max_len;
}
slowlog链表保存了服务器的所有慢查询日志, 链表中的每个节点都保存了一个slowlogEntry结构, 每个slowlogEntry结构代表一条慢查询日志:
typedef struct slowlogEntry {
// 唯一标示符
long long id;
// 命令执行时的时间, 格式为UNIX时间戳
time_t time;
// 执行命令消耗的时间, 以微秒为单位
long long duration;
// 命令与命令参数
robj **argv;
// 命令与命令参数的数量
int argc;
} slowlogEntry;
慢查询日志的阅览和删除
弄清楚了服务器状态的slowlog链表的作用之后, SLOWLOG GET命令就可以理解为遍历slowlog链表中的所有数据。
SLOWLOG LEN命令可以查询当前慢查询日志的数量.
SLOWLOG RESET用于清除所有慢查询日志.
添加新日志
在每次执行命令之前和之后, 程序都会记录微秒格式的当前UNIX时间戳, 这两个时间戳之间的差就是服务器执行命令所耗费的时长, 服务器会将这个时长作为参数之一传给slowlogPushEntryIfNeeded函数, 而该函数则负责检查是否需要为这次执行的命令创建慢查询日志.
-
检查命令的执行时长是否超过了
slowlog-log-slower-than选项所设置的时间, 如果是的话, 就为命令创建一个新的日志, 并将新日志添加到slowlog链表的表头 -
检查慢查询日志的长度是否超过了
slowlog-max-len选项所设置的长度, 如果是, 那么将多出来的日志从slowlog