慢查询分析
一、介绍
-
定义
系统在命令执行前后,计算每条命令的执行时间,操作预期阀值,就将这条命令的相关信息记录下来。
-
流程
redis在执行一条命令的时候,大概是分为4个流程:发送命令、命令排队、执行命令、返回结果。
-
预设阀值怎么设置?
Redis提供了预设阀值:slowlog-log-slower-than,单位是微秒,默认10000微秒,执行一条很慢的命令(例如keys *),执行时间超过了10000微秒,则这条命令会被记录在慢查询日志中。
127.0.0.1:6379> config get slowlog-log-slower-than
1) "slowlog-log-slower-than"
2) "10000"
127.0.0.1:6379> config get slowlog-max-len
1) "slowlog-max-len"
2) "128"
注:slowlog-log-slower-than=0,则表示记录所有命令,slowlog-log-slower-than<0则不会被记录。
-
慢查询记录放在哪里?
slowlog-log-slower-than只是说明慢查询最多存储多少条,并没有说明慢查询日志放在哪?Redis使用了一个列表来存储慢查询日志,slowlog-max-len表示的是当前列表的最大长度。例如slowlog-max-len设置为5,当有第6条慢查询 插入的话,那么队头的第一条数据就出列,第6条慢查询就会入列。
5.修改配置文件
(1)使用配置文件修改
(2)使用动态命令修改
127.0.0.1:6379> config get slowlog-log-slower-than
1) "slowlog-log-slower-than"
2) "10000"
127.0.0.1:6379> config set slowlog-log-slower-than 20000
OK
127.0.0.1:6379> config get slowlog-log-slower-than
1) "slowlog-log-slower-than"
2) "20000"
如果要Redis将配置持久化到本地配置文件,需要执行config rewrite命令。
二、命令
慢查询由4部分组成:日志标识id、时间戳、命令耗时和参数。
(1)获取慢查询日志(slowlog get)
127.0.0.1:6379> slowlog get 1
1) 1) (integer) 21
2) (integer) 1574860505
3) (integer) 47941
4) 1) "set"
2) "A"
3) "20"
(2)获取慢查询日志的当前长度
127.0.0.1:6379> slowlog len
(integer) 22
(3)慢查询日志重置
127.0.0.1:6379> slowlog reset
OK
127.0.0.1:6379> slowlog len
(integer) 0
127.0.0.1:6379> slowlog get
(empty list or set)
三、开发注意事项
(1)slow-max-len配置建议:
生产上建议调大慢查询列表,可以设置为1000以上。
(2)slowlog-log-slower-than配置建议:
默认值超过10毫秒的就被判定为是慢查询。线上对于高流量场景,redis建议设置为1毫秒。
(3)慢查询只会记录查询的时间
因此客户端执行命令的时间会大于命令实际执行时间,需要检查该时间点是否有对应的慢查询。
(4)慢查询是一个先进先出的队列
在慢查询比较多的情况下,可能会丢失部分慢查询命令,为了防止这种情况发生,可以定期执行slow get命令将慢查询日志持久化到其他存储中(例如MySQL),然后可以制作可视化界面进行查询。