Redis 有慢查询怎么办?

PassJava (佳必过) 项目全套学习教程连载中,关注公众号悟空聊架构第一时间获取。

文档在线地址: www.passjava.cn

慢查询日志

获取慢查询日志

showlog get [N]

日志包含四个部分:日志的标识 id、发生时间戳、命令耗时、执行命令和参数。

获取慢查询日志列表的当前的长度

showlog len

清空慢查询日志

showlog reset

慢查询命令的复杂度

命令的慢操作和操作的复杂度相关。操作度复杂度查询:

https://redis.io/commands

当发现 Redis 性能变慢时,可以通过 Redis 日志,或者是 latency monitor 工具,查询变慢的请求,根据请求对应的具体命令以及官方文档,确认下是否采用了复杂度高的慢查询命令。

比如我们可以看到 keys命令的复杂度为 O(N)。如下图所示:

用高效命令替换

如果的确有大量的慢查询命令,用其他高效命令代替。

  • 当需要返回一个 SET 中的所有成员时,不要使用 SMEMBERS 命令,而是要使用 SSCAN 多次迭代返回,避免一次返回大量数据,造成线程阻塞。

  • 需要执行排序、交集、并集操作时,可以在客户端完成,而不要用 SORT、SUNION、SINTER 这些命令,以免拖慢 Redis 实例。

KEYS 命令需要遍历存储的键值对,所以操作延时高。KEYS 命令一般不被建议用于生产环境中。

最佳实践

关于慢查询日志的配置有两个:slowlog-max-len、slowlog-log-slower-than

slowlog-max-len

作用:慢查询日志最多存储多少条。

默认值

从源码中我们可以找到这个选项的默认值为 128

配置建议:线上建议调大慢查询列表,避免长命令在记录时被截断,且不会占用大量内存。线上可以配置为 1000 以上。

slowlog-log-slower-than

作用:慢查询的预设阀值,当命令的耗时超过这个配置就会被记录到慢查询日志中。

默认值是 10 ms。

配置建议:默认值超过 10ms 被判定为慢查询,需要根据并发量来调整,高流量场景 配置为 1 ms。

将慢查询日志持久化到数据库,避免丢失日志,而且可以开发可视化的查询界面供运维排查。

作者简介:悟空,8年一线互联网开发和架构经验,用故事讲解分布式、架构设计、Java 核心技术。《JVM性能优化实战》专栏作者,开源了《Spring Cloud 实战 PassJava》项目,公众号:悟空聊架构

悟空的开源项目

https://github.com/Jackson0714/PassJava-Platform