《Redis开发与运维》慢查询分析 读书笔记

791 阅读3分钟

慢查询日志就是系统在命令执行前后计算每条命令的执行时间,当超过了设置的阀值,就将这条命令的信息(发生时间、耗时、命令详细信息等)记录下来。

客户端命令执行生命周期

  Redis的客户端分为四个部分,如下图所示:

在这里插入图片描述

  • 发送命令
  • 命令排队
  • 命令执行
  • 返回结果

注意:慢查询只统计命令执行时间,所以没有慢查询并不代表客户端没有超时问题。

慢查询参数配置

  • slowlog-log-slower-than

  slowlog-log-slower-than 是预设阀值,单位微妙(默认10000),如果有一条命令的执行时间超过了 10000 微妙那么这条命令将被记录在慢查询日志中。   提示:如果 slowlog-log-slower-than = 0 会记录所有命令,如果 slowlog-log-slower-than < 0 任何命令都不会记录。

  • slowlog-max-than

  slowlog-max-than 说明慢查询日志最多存储多少条记录,并没有说明存储在哪个位置?在 Redis 中使用了一个列表来存储慢查询日志,slowlog-max-than 就是列表的最大长度。一个命令如果满足慢查询的条件,就会将这条命令插入到列表中。   提示:当慢查询日志列表已处于最大长度时,最早插入的一个命令将从列表中移除。

  • 使用 config set 命令动态修改配置
### 修改阀值和设置列表最大长度
config set slowlog-log-slower-than 20000
config set slowlog-max-len 1000
### 将配置持久化到本地文件
config rewrite
  • 获取慢查询日志
###  n 可以指定条数
slowlog get \[n\]
  • 慢查询日志数据结构   每一个慢查询日志由 4 个属性组成,分别是慢查询日志的标识 id、发生时间戳、命令耗时、执行命令和参数。如下图所示:

    在这里插入图片描述

  • 获取慢查询日志列表长度

slowlog len
  • 慢查询日志重置
slowlog reset

慢查询使用建议

  • slowlog-max-len:线上调大慢查询列表,记录慢查询时 Redis 会对长命令做截断操作,并不会占用大量内存。增大慢查询列表可以减缓慢查询被剔除的可能性。
  • slowlog-log-slower-than:建议超过10毫秒判定为慢查询,需要根据 Redis 并发量调整该值。对于高流量场景,如果命令执行在1毫秒以上,那么 Redis 最多可支撑 OPS 不到1000。所以对于高 OPS 场景建议设置为1毫秒。
  • 慢查询只记录命令时间,因此客户端执行命令的时间会大于命令实际执行时间。因为命令执行排队机制,慢查询会导致其它命令级联阻塞,所以在出现请求超时情况下需要检查该时间点会不会出现慢查询,从而分析是否为慢查询导致的级联阻塞。
  • 在慢查询比较多的情况下,可能会丢失部分慢查询命令,为了防止丢失部分慢查询命令可以定期执行 slow get 命令将慢查询日志持久化到其它存储中(例如 MySQL),然后制作可视化界面进行查询。