type
status
date
slug
summary
tags
category
icon
password
Property
Redis
的慢查询日志功能用于记录执行时间超过给定时长的命令请求, 用户可以通过这个功能产生的日志来监视和优化查询速度。服务器配置有两个和慢查询日志相关的选项:slowlog-log-slower-than
选项指定执行时间超过多少微秒(1
秒等于1,000,000
微秒)的命令请求会被记录到日志上
举个例子, 如果这个选项的值为
100
, 那么执行时间超过 100
微秒的命令就会被记录到慢查询日志; slowlog-max-len
选项指定服务器最多保存多少条慢查询日志
服务器使用先进先出的方式保存多条慢查询日志: 当服务器储存的慢查询日志数量等于
slowlog-max-len
选项的值时, 服务器在添加一条新的慢查询日志之前, 会先将最旧的一条慢查询日志删除。 如果服务器 slowlog-max-len
的值为 100
, 并且假设服务器已经储存了100
条慢查询日志, 那么如果服务器打算添加一条新日志的话, 它就必须先删除目前保存的最旧的那条日志, 然后再添加新日志。用
CONFIG_SET
命令将 slowlog-log-slower-than
选项的值设为0
微秒, 这样Redis
服务器执行的任何命令都会被记录到慢查询日志中, 接着将slowlog-max-len
选项的值设为5
, 让服务器最多只保存5
条慢查询日志接着, 用客户端发送几条命令请求:
然后使用
SLOWLOG GET
命令查看服务器所保存的慢查询日志:如果这时再执行一条
SLOWLOG GET
命令, 那么将看到, 上一次执行的SLOWLOG GET
命令已经被记录到了慢查询日志中, 而最旧的、编号为0
的慢查询日志已经被删除, 服务器的慢查询日志数量仍然为5
条:慢查询记录的保存
服务器状态中包含了几个和慢查询日志功能有关的属性:
slowlog_entry_id
属性的初始值为 0
, 每当创建一条新的慢查询日志时, 这个属性的值就会用作新日志的 id
值, 之后程序会对这个属性的值增一。slowlog
链表保存了服务器中的所有慢查询日志, 链表中的每个节点都保存了一个slowlogEntry
结构, 每个slowlogEntry
结构代表一条慢查询日志:对于以下慢查询日志来说:
slowlog_entry_id
的值为6
, 表示服务器下条慢查询日志的id
值将为6
slowlog
链表包含了id
为5
至1
的慢查询日志, 最新的5
号日志排在链表的表头, 而最旧的1
号日志排在链表的表尾, 这表明slowlog
链表是使用插入到表头的方式来添加新日志的
slowlog_log_slower_than
记录了服务器配置slowlog-log-slower-than
选项的值0
, 表示任何执行时间超过0
微秒的命令都会被慢查询日志记录
slowlog-max-len
属性记录了服务器配置slowlog-max-len
选项的值5
, 表示服务器最多储存五条慢查询日志
慢查询日志的阅览和删除
弄清楚了服务器状态的
slowlog
链表的作用之后, 可以用以下伪代码来定义查看日志的SLOWLOG GET
命令:查看日志数量的
SLOWLOG LEN
命令可以用以下伪代码来定义:用于清除所有慢查询日志的
SLOWLOG RESET
命令可以用以下伪代码来定义:添加新日志
在每次执行命令的之前和之后, 程序都会记录微秒格式的当前
UNIX
时间戳, 这两个时间戳之间的差就是服务器执行命令所耗费的时长, 服务器会将这个时长作为参数之一传给slowlogPushEntryIfNeeded
函数, 而slowlogPushEntryIfNeeded
函数则负责检查是否需要为这次执行的命令创建慢查询日志, 以下伪代码展示了这一过程:slowlogPushEntryIfNeeded
函数的作用有两个:- 检查命令的执行时长是否超过
slowlog-log-slower-than
选项所设置的时间, 如果是的话, 就为命令创建一个新的日志, 并将新日志添加到slowlog
链表的表头。
- 检查慢查询日志的长度是否超过
slowlog-max-len
选项所设置的长度, 如果是的话, 那么将多出来的日志从slowlog
链表中删除掉。
以下是
slowlogPushEntryIfNeeded
函数的实现代码:slowlogCreateEntry
函数: 该函数根据传入的参数, 创建一个新的慢查询日志, 并将 redisServer.slowlog_entry_id
的值增一。假设服务器当前保存的慢查询日志如图所示:
如果执行命令
EXPIRE msg 10086
,服务器在执行完这个 EXPIRE
命令之后, 就会调用slowlogPushEntryIfNeeded
函数, 函数将为EXPIRE
命令创建一条id
为6
的慢查询日志, 并将这条新日志添加到slowlog
链表的表头:除了
slowlog
链表发生了变化之外, slowlog_entry_id
的值也从6
变为7
了。之后,
slowlogPushEntryIfNeeded
函数发现, 服务器设定的最大慢查询日志数目为5
条, 而目前保存的慢查询日志数目为6
条, 于是服务器将id
为1
的日志删除, 让服务器的慢查询日志数量回到设定好的5
条。