一、查询生命周期
一条查询的生命周期:
- 发送命令
- 命令排队
- 执行命令
- 返回结果
Redis 慢日志只统计 “执行命令” 步骤 3 的耗时,所以没有慢查询并不代表客户端没有超时问题。
二、慢日志配置参数
慢日志相关的参数有两个:
slowlog-log-slower-than
慢日志的阈值,单位是微秒
(1秒=1000毫秒=1000000微秒)默认值 10000 (10 毫秒)
如果设置为 0 将会记录所有的命令,如果 < 0 则任何命令都不会记录。
slowlog-max-len
Redis 的慢日志实际上是存在在列表中的,该参数即为列表的长度,可以存储多少条命令。
先进先出队列,如果慢查询较多的话,可能会丢失一部分,所以需要按照需求设定该值,或者搭建慢查询分析平台。
慢日志动态修改:
config set slowlog-log-slower-than 10000
config set slowlog-max-len 128
config rewrite
获取慢查询数量:
slowlog len
127.0.0.1:6379> slowlog len
(integer) 7
获取慢查询日志:
# n 指一次慢日志的数量
slowlog get n
127.0.0.1:6379> slowlog get 1
1) 1) (integer) 6
2) (integer) 1635833786
3) (integer) 41971
4) 1) "keys"
2) "*"
5) "127.0.0.1:33262"
6) ""
清空慢日志队列:
slowlog reset
三、使用经验
慢查询只记录命令执行时间,并不包括命令排队和网络传输时间。因此客户端执行命令的时间会大于命令实际执行时间。因为命令执行排队机制,慢查询会导致其他命令级联阻塞,因此当客户端出现请求超时,需要检查该时间点是否有对应的慢查询,从而分析出是否为慢查询导致的命令级联阻塞。