Redis09-慢查询分析

234 阅读3分钟

慢查询分析

一、介绍

  1. 定义

    系统在命令执行前后,计算每条命令的执行时间,操作预期阀值,就将这条命令的相关信息记录下来。

  2. 流程

    redis在执行一条命令的时候,大概是分为4个流程:发送命令、命令排队、执行命令、返回结果。

  1. 预设阀值怎么设置?

    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则不会被记录。

  1. 慢查询记录放在哪里?

    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),然后可以制作可视化界面进行查询。