Redis是单线程操作,如果一个命令执行耗时较长的操作,就会阻塞其他请求,严重会影响整个平台的稳定.慢日志监控的重要性也就体现处理了.
在讲解pipeline时,曾讲过命令执行的4个阶段:
1.发送命令
2.命令排队
3.命令执行
4.返回结果
慢日志主要是监控记录命令执行阶段的命令相关信息.
这些执行慢的命令是保存在一个先进先出队列中,这个队列的长度固定,当队列满了之后会移除掉最先保存的数据.并且这个队列只保存到内存中,不会持久化.
这个队列的长度和时间阈值都是通过redis.conf配置的,
配置如下:
代码语言:javascript复制#慢日志时间阈值,单位:微妙
slowlog-log-slower-than 10000
#慢日志队列长度
slowlog-max-len 128
通过config命令动态配置
代码语言:javascript复制127.0.0.1:6379> config get slowlog*
1) "slowlog-log-slower-than"
2) "10000"
3) "slowlog-max-len"
4) "128"
慢日志操作命令
使用debug sleep模拟长时间查询操作
代码语言:javascript复制127.0.0.1:6379> debug sleep 1
OK
(1.00s)
查询慢日志数据
结果含义:
1) 每个慢日志条的唯一累进标识符
2) 记录命令执行的Unix时间戳
3) 命令执行所需的时间(以微秒为单位)
4) 组成命令参数的数组
5) 客户端IP地址和端口
6) 客户端名称(如果通过CLIENT SETNAME命令设置)
代码语言:javascript复制127.0.0.1:6379> slowlog get 10
1) 1) (integer) 2
2) (integer) 1589791533
3) (integer) 1001795
4) 1) "debug"
2) "sleep"
3) "1"
5) "127.0.0.1:55526"
6) ""
查看慢日志数量
代码语言:javascript复制127.0.0.1:6379> slowlog len
(integer) 1
重置慢日志数据
代码语言:javascript复制127.0.0.1:6379> slowlog reset
OK
注意事项
1. 时间阈值不要设置过大,不利于正确记录那些会影响到服务的命令
2. 队列长度不要过小,不利于数据保存
3. 因为队列信息不会自动持久化,需要人为持久化处理