redis · 10 4 月, 2021 0

Redis慢日志查询

慢日志查询

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链表中删除.