Redis的慢查询日志详解

Redis的SLOWLOG命令可用来读取和重置Redis的慢查询日志。这个命令的格式如下所示:

  1. SLOWLOG subcommand [argument]

1. 慢查询日志概述

Redis的慢查询日志负责记录超过指定执行时间的查询操作。这个执行时间并不包括I/O操作(例如,服务端和客户端之间的通信、发送应答消息,等等),它仅仅是执行命令实际需要消耗的时间(只有在命令执行的阶段,Redis才会阻塞线程,此时就不能处理其他请求了)。

慢查询日志具有两个配置参数:slowlog-log-slower-than参数用于指定执行时间的上限值(以微秒为单位),Redis会记录执行时间超过这个上限值的查询操作。注意:若将这个参数设为负数,则会禁用慢查询日志;若将这个参数设为零,则会强制记录每条命令。slowlog-max-len参数用于指定慢查询日志的最大长度。这个参数的最小值为零。当Redis将一条新命令记录入慢查询日志时,如果慢查询日志已经达到最大长度,那么Redis会从日志队列中移除最老的命令日志,这样便能为新的命令日志腾出空间。

你可以在redis.conf文件中配置上述两个参数,也可以在Redis运行时使用CONFIG GETCONFIG SET命令进行配置。

2. 读取慢查询日志

Redis会将慢查询日志保存在内存之中,不会将执行速度较慢的命令的相关信息写入任何文件。这种特性使得慢查询日志的操作速度非常快,你甚至可以记录所有的命令日志(将slowlog-log-slower-than配置参数设为零),同时几乎不会影响系统性能。

你可以使用SLOWLOG GET命令读取慢查询日志,这个命令会返回慢查询日志中的每个条目。你还可以从慢查询日志读取最近N个条目,只要给这个命令传一个参数即可(例如:SLOWLOG GET 10)。

注意,你需要使用最近版本的redis-cli客户端,因为慢查询日志需要使用Redis协议的某些功能,而较老的redis-cli客户端并没有实现这些功能(深度嵌套的多重批量回复),它们也就不能读取慢查询日志的输出信息。

3. 输出格式

慢查询日志的输出格式如下图所示:

慢查询日志的输出格式

每个条目由以下四个字段组成:

  • 一个唯一的递增标识符,用于区分每个慢查询日志条目。
  • Redis执行命令的UNIX时间戳。
  • 执行命令耗费的时间总量,以微秒为单位。
  • 组成完整命令的参数数组。

日志条目的唯一标识符可用于避免多次重复处理相同的慢查询日志条目(例如,你可能会使用一个脚本,每当产生新的慢查询日志条目时,就会给你发送一封报警邮件)。

在Redis服务器的运行期间,这个标识符永远不会被重置,只有当服务器重新启动时才会被重置。

4. 获取慢查询日志的长度

如果想要获得慢查询日志的当前长度,那么你可以使用SLOWLOG LEN命令。

5. 重置慢查询日志

你可以使用SLOWLOG RESET命令重置慢查询日志。一旦删除,先前记录的慢查询日志就会永久丢失。