慢查询只统计步骤3的时间, 所以没有慢查询并不代表客户端没有超时问题.
3.1.1 慢查询的两个配置参数
- 预设阀值: slowlog-log-slower-than
- 单位: 微秒
- 默认: 10000 (10ms)
- =0: 记录所有命令
- <0: 不记录命令
- 慢查询命令最大条数: slowlog-max-len
- 慢查询日志存放在内存中: list
在交互式中配置:
config set slowlog-log-slower-than 2000
config set slowlog-max-len 1000
config rewrite # 将配置持久化到本地配置文件
- 获取慢查询日志
slowlog get [n]
慢查询日志格式:
- 获取慢查询日志列表当前的长度
slowlog len
- 慢查询日志重置
slowlog reset
3.1.2 最佳实践
- slowlog-max-len 配置建议: 线上建议调大慢查询列表,记录慢查询时 Redis 会对长命令做截断操作, 并不会占用大量内存。增大慢查询列表可以减缓慢查询被剔除的可能, 例如线上可设置为1000以上
- slowlog-log-slower-than 配置建议: 默认值超过10毫秒判定为慢查询, 需要根据Redis并发量调整该值。由于Redis采用单线程响应命令, 对于高流量的场景, 如果命令执行时间在1毫秒以上 ,那么 Redis 最多可支撑OPS不到1000。因此对于高OPS场景的Redis建议设置为1毫秒
- 慢查询只记录命令执行时间, 并不包括命令排队和网络传输时间。因此客户端执行命令的时间会大于命令实际执行时间。因为命令执行排队机制, 慢查询会导致其他命令级联阻塞, 因此当客户端出现请求超时, 需要检查该时间点是否有对应的慢查询, 从而分析出是否为慢查询导致的命令级联阻塞
- 由于慢查询日志是一个先进先出的队列, 也就是说如果慢查询比较多的情况下, 可能会丢失部分慢查询命令,为了防止这种情况发生, 可以定期执行 slow get 命令将慢查询日志持久化到其他存储中 (例如 MySQL), 然后可以制作可视化界面进行查询