redis的slow log记录了那些执行时间超过规定时长的请求。执行时间不包括I/O操做(好比与客户端进行网络通讯等),只是命令的实际执行时间(期间线程会被阻塞,没法服务于其它请求)。 css
有两个参数用于配置slow log: redis
slowlog-log-slower-than:设定执行时间,单位是毫秒,执行时长超过该时间的命令将会被记入log。-1表示不记录slow log; 0强制记录全部命令。 网络
slowlog-max-len: slow log的长度。最小值为0。若是日志队列已超出最大长度,则最先的记录会被从队列中清除。 工具
能够经过编辑redis.conf文件配置以上两个参数。对运行中的redis, 能够经过config get, config set命令动态改变上述两个参数性能
使用这个命令能够读取或重置 Redis 慢速查询日志。通俗讲就是 redis 能够把执行时间超过咱们设定值的命令记录下来,slowlog 是记录到内存中的哦,因此很是快。spa
两种方式:线程
这里咱们主要说的是第二种方式,您可使用两个参数来配置慢日志:slowlog-log-slow-than * ,告诉 Redis, 记录超过 * 微秒 内的命令执行状况。unix
须要注意的是,设置负数表示禁用 slowlog ,而设置 0 则强制记录每一个命令的执行状况。
如下是 slowlog 的设置使用说明:日志
redis 127.0.0.1:6379>config set slowlog-log-slower-than 10000
"OK"
redis 127.0.0.1:6379>config get slowlog-log-slower-than
1) "slowlog-log-slower-than"
2) "10000"
那么问题又来了,slowlog 是记录再内存中的,若是记录全部的命令 log 会不会把内容撑爆呢?code
答案是固然不会。slowlog 记录的 log 数是有最大长度限制的,咱们能够经过 slowlog-max-len 来查询 slowlog 的最大长度。最小值为零。当一个新的命令被记录下来,而且若是已经达到它的最大长度时,最老的一个 log 将从队列中删除,FIFO 。
另外,使用 slowlog len 命令能够查看当前已记录的数量。
使用 slowlog reset 重置已记录的 slowlog 信息。
咱们已经了解 slowlog 是记录在内存中的,因此您能够启用全部命令的日志记录即 slowlog-log-slow-than 配置参数设置为 0 便于监测性能。
要读取 slowlog,使用 SLOWLOG GET 获取命令,它返回慢日志中的每个条目。能够只返回N个最近的条目,将一个附加参数传递给命令(例如 SLOWLOG GET 2)。
redis 127.0.0.1:6379> slowlog get 2
1) 1) (integer) 14 //slowlog 惟一标识
2) (integer) 1309448221 //unix 时间戳
3) (integer) 15 //命令执行的时间,单位:微秒
4) 1) "ping" //具体执行的命令,最多记录128
2) 1) (integer) 13
2) (integer) 1309448128
3) (integer) 30
4) 1) "slowlog"
2) "get"
3) "100"
//其中 Redis 4.0 及以上版本还包含如下两部分:
5) "127.0.0.1:58217" //客户端IP:Port
6) "worker-123" //客户端名称
最后,须要注意此命令须要 2.2.12及以上版本的 redis 才能支持。
因为慢查询日志是一个先进先出的队列,也就是说若是慢查询比较多的状况下,可能会丢失部分慢查询命令,为了防止这种状况发生,能够按期执行slowlog get
命令将慢查询日志持久化到其余存储中(例如:MySQL
、ElasticSearch
等),而后能够经过可视化工具进行查询
查看当前日志的数量:
redis 127.0.0.1:6379> SLOWLOG LEN (integer) 14
使用命令 SLOWLOG RESET 能够清空 slow log 。
redis 127.0.0.1:6379> SLOWLOG LEN (integer) 14 redis 127.0.0.1:6379> SLOWLOG RESET OK redis 127.0.0.1:6379> SLOWLOG LEN (integer) 0