第23章 慢查询日志
Redis的慢查询日志功能用于记录执行时间超过给定时长的命令请求,用户可以通过这个功能产生的日志来监视和优化查询速度。
服务器配置有两个和慢查询日志相关的选项:
·slowlog-log-slower-than选项指定执行时间超过多少微秒(1秒等于1 000 000微秒)的命令请求会被记录到日志上。
举个例子,如果这个选项的值为100,那么执行时间超过100微秒的命令就会被记录到慢查询日志;如果这个选项的值为500,那么执行时间超过500微秒的命令就会被记录到慢查询日志。
·slowlog-max-len选项指定服务器最多保存多少条慢查询日志。
服务器使用先进先出的方式保存多条慢查询日志,当服务器存储的慢查询日志数量等于slowlog-max-len选项的值时,服务器在添加一条新的慢查询日志之前,会先将最旧的一条慢查询日志删除。
举个例子,如果服务器slowlog-max-len的值为100,并且假设服务器已经储存了100条慢查询日志,那么如果服务器打算添加一条新日志的话,它就必须先删除目前保存的最旧的那条日志,然后再添加新日志。
我们来看一个慢查询日志功能的例子,首先用CONFIG SET命令将slowlog-log-slower-than选项的值设为0微秒,这样Redis服务器执行的任何命令都会被记录到慢查询日志中,接着将slowlog-max-len选项的值设为5,让服务器最多只保存5条慢查询日志:
redis> CONFIG SET slowlog-log-slower-than 0
OK
redis> CONFIG SET slowlog-max-len 5
OK
接着,我们用客户端发送几条命令请求:
redis> SET msg "hello world"
OK
redis> SET number 10086
OK
redis> SET database "Redis"
OK
然后使用SLOWLOG GET命令查看服务器所保存的慢查询日志:
redis> SLOWLOG GET
1) 1)
(integer
) 4 #
日志的唯一标识符(uid
)
2) (integer) 1378781447 #
命令执行时的UNIX
时间戳
3) (integer) 13 #
命令执行的时长,以微秒计算
4) 1) "SET" #
命令以及命令参数
2) "database"
3) "Redis"
2) 1) (integer) 3
2) (integer) 1378781439
3) (integer) 10
4) 1) "SET"
2) "number"
3) "10086"
3) 1) (integer) 2
2) (integer) 1378781436
3) (integer) 18
4) 1) "SET"
2) "msg"
3) "hello world"
4) 1) (integer) 1
2) (integer) 1378781425
3) (integer) 11
4) 1) "CONFIG"
2) "SET"
3) "slowlog-max-len"
4) "5"
5) 1) (integer) 0
2) (integer) 1378781415
3) (integer) 53
4) 1) "CONFIG"
2) "SET"
3) "slowlog-log-slower-than"
4) "0"
如果这时再执行一条SLOWLOG GET命令,那么我们将看到,上一次执行的SLOWLOG GET命令已经被记录到了慢查询日志中,而最旧的、ID为0的慢查询日志已经被删除,服务器的慢查询日志数量仍然为5条:
redis> SLOWLOG GET
1) 1) (integer) 5
2) (integer) 1378781521
3) (integer) 61
4) 1) "SLOWLOG"
2) "GET"
2) 1) (integer) 4
2) (integer) 1378781447
3) (integer) 13
4) 1) "SET"
2) "database"
3) "Redis"
3) 1) (integer) 3
2) (integer) 1378781439
3) (integer) 10
4) 1) "SET"
2) "number"
3) "10086"
4) 1) (integer) 2
2) (integer) 1378781436
3) (integer) 18
4) 1) "SET"
2) "msg"
3) "hello world"
5) 1) (integer) 1
2) (integer) 1378781425
3) (integer) 11
4) 1) "CONFIG"
2) "SET"
3) "slowlog-max-len"
4) "5"