面试突击 004 | 如何排查 Redis 中的慢查询?视频实战篇_第1张图片

这是我的第 34 篇原创文章
作者 | 老王(javacn666)
1 面试题

如何排查 Redis 中的慢查询?
2 涉及相关问题

  1. Redis 中有没有慢查询排查工具或者相关排查手段?
  2. 慢查询日志都包含哪些信息?
  3. 慢查询的相关配置项有哪些?默认值是啥?应该如何设置?
  4. 如果慢查询的队列满了?会怎样?
  5. 在代码中如何实现 Redis 的慢查询?
    3 答案

首先来说 Redis 中有慢查询日志,是可以实现 Redis 慢操作排查的。

  • 慢日志包含的内容有:
  • 慢查询的具体执行命令;
  • 慢查询的执行时间;
  • 慢查询的执行时长。
    慢查询日志内容如下:
    127.0.0.1:6379> slowlog get #慢日志查询
    1) 1) (integer) 2 #慢日志下标
    2) (integer) 1581994139 #执行时间
    3) (integer) 5 #花费时间 (单位微秒)
    4) 1) "set" #执行的具体命令
      2) "lang"
      3) "java"
    5) "127.0.0.1:47068"
    6) ""
    2) 1) (integer) 1
    2) (integer) 1581994131
    3) (integer) 6
    4) 1) "set"
      2) "msg"
      3) "xiaoming"
    5) "127.0.0.1:47068"
    6) ""
    3) 1) (integer) 0
    2) (integer) 1581994093
    3) (integer) 5
    4) 1) "config"
      2) "set"
      3) "slowlog-log-slower-than"
      4) "0"
    5) "127.0.0.1:47068"
    6) ""

    慢日志模拟添加,详见视频 。
    慢日志查询相关的配置信息有两个:

  • slowlog-log-slower-than :用于设置慢查询的评定时间,也就是说超过此配置项的命令,将会被当成慢操作记录在慢查询日志中,它执行单位是微秒 (1 秒等于 1000000 微秒);
  • slowlog-max-len :用来配置慢查询日志的最大记录数。
    默认值如下:
    127.0.0.1:6379> config get slowlog-log-slower-than #慢查询判断时间
    1) "slowlog-log-slower-than"
    2) "10000"
    127.0.0.1:6379> config get slowlog-max-len #慢查询最大记录条数
    1) "slowlog-max-len"
    2) "128"

    可以看出慢查询的临界值是 10000 微秒,默认保存 128 条慢查询记录。
    4 代码实战

本文我们使用 Java 来实现慢查询日志的操作,代码如下:

import redis.clients.jedis.Jedis;
import redis.clients.jedis.util.Slowlog;
import utils.JedisUtils;
import java.util.List;
/**
 * 慢查询
 */
public class SlowExample {
    public static void main(String[] args) {
        Jedis jedis = JedisUtils.getJedis();
        // 插入慢查询(因为 slowlog-log-slower-than 设置为 0,所有命令都符合慢操作)
        jedis.set("db", "java");
        jedis.set("lang", "java");
        // 慢查询记录的条数
        long logLen = jedis.slowlogLen();
        // 所有慢查询
        List list = jedis.slowlogGet();
        // 循环打印
        for (Slowlog item : list) {
            System.out.println("慢查询命令:"+ item.getArgs()+
                    " 执行了:"+item.getExecutionTime()+" 微秒");
        }
        // 清空慢查询日志
        jedis.slowlogReset();
    }
}

以上代码执行结果如下:
慢查询命令:[SLOWLOG, len] 执行了:1 微秒
慢查询命令:[SET, lang, java] 执行了:2 微秒
慢查询命令:[SET, db, java] 执行了:4 微秒
慢查询命令:[SLOWLOG, reset] 执行了:155 微秒
5 视频

视频内容如下:

6 小结

本文我们介绍了慢查询相关的两个重要参数 slowlog-log-slower-than (用于设置慢查询的评定时间) 和 slowlog-max-len 用来配置慢查询日志的最大记录数,然后通过修改 config set slowlog-log-slower-than 0 把所有操作都记录在慢日志进行相关测试。我们可以使用 slowlog get [n] 查询慢操作日志,使用 slowlog reset 清空慢查询日志。最后给大家一个建议,可以定期检查慢查询日志,及时发现和改进 Redis 运行中不合理的操作。
更多内容,详见视频部分。
【END】
近期热文

  • 面试突击 003 | Redis 如何实现查询附近的人?视频实战版
  • 面试突击 002 | Redis 是如何处理已过期元素的?附视频
  • 面试突击 001 | Redis 如何从海量数据中查询出某一个 Key?视频版
  • Java面试详解(2020版):500+ 面试题和核心知识点详解
  • 面试珍藏:最常见的200多道Java面试题(2019年最新版)
    关注下方二维码,订阅更多精彩内容
    面试突击 004 | 如何排查 Redis 中的慢查询?视频实战篇_第2张图片