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