跟众多数据库的慢查询一样,平时不希望看到,但是数据库响应慢的时候,又希望能在慢查询中找到罪魁祸首。这一节内容,就来简单聊聊如何在 Redis 中找到慢查询。
Redis 可以记录执行时间超过某个阈值的命令,这个阈值由参数 slowlog-log-slower-than 控制,单位是微秒,默认值 10000。
参数 slowlog-max-len 可以控制保存慢日志的条数,Redis 底层是使用列表来存储慢查询日志,slowlog-max-len 就是列表的最大长度。当慢查询数达到该参数配置的值时,如果继续有新增的慢查询,则最早插入的慢查询会被删除。
可通过下面命令获取到所有慢查询:
代码语言:javascript复制127.0.0.1:6379> slowlog get
1) 1) (integer) 0
2) (integer) 1647236811
3) (integer) 30541
4) 1) "SLOWLOG"
2) "GEY"
5) "127.0.0.1:47252"
6) ""
慢日志中,每个结果都包含以下六个值,可与上面列子一一对应:
- 每个慢日志的唯一 ID;
- 命令执行的时间戳;
- 命令以及参数;
- 客户端IP地址和端口;
- 客户端名称(假如通过 client setname 设置了)。
查看有多少慢查询:
代码语言:javascript复制127.0.0.1:6379> slowlog len
(integer) 1
获取其中一条慢查询:
代码语言:javascript复制127.0.0.1:6379> slowlog get 1
1) 1) (integer) 0
2) (integer) 1647236811
3) (integer) 30541
4) 1) "SLOWLOG"
2) "GEY"
5) "12
清空慢查询记录:
代码语言:javascript复制127.0.0.1:6379> slowlog reset
OK
Redis 慢查询注意点:
- 慢查询只记录命令执行时间,并不包括命令排队和网络传输时间;
- 生产环境 slowlog-max-len 可以配置 1000 以上,方便我们查看,Redis 记录慢查询时,会对长命令做截断操作,并不会占用过多内存;
- slowlog-log-slower-than 默认为 10000,对 QPS 要求更高的场景,可把 slowlog-log-slower-than 调整的更小,比如 1000;
- 如果想对慢查询做持久化,可以监听慢查询的变化,比如 slowlog get 之后,过滤出第一个字段(ID字段),如果 ID 有变化,则获取慢查询详情,写入其他其他关系型数据库中。或者借助其他工具,比如 CacheCloud。