这是个人第 34 篇原创文章
做者 | 老王(javacn666)
1 面试题java
如何排查 Redis 中的慢查询?
2 涉及相关问题面试
首先来讲 Redis 中有慢查询日志,是能够实现 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) ""
慢日志模拟添加,详见视频 。
慢日志查询相关的配置信息有两个:ide
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<Slowlog> 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 视频日志
视频内容以下:code
6 小结视频
本文咱们介绍了慢查询相关的两个重要参数 slowlog-log-slower-than (用于设置慢查询的评定时间) 和 slowlog-max-len 用来配置慢查询日志的最大记录数,而后经过修改 config set slowlog-log-slower-than 0 把全部操做都记录在慢日志进行相关测试。咱们能够使用 slowlog get [n] 查询慢操做日志,使用 slowlog reset 清空慢查询日志。最后给你们一个建议,能够按期检查慢查询日志,及时发现和改进 Redis 运行中不合理的操做。
更多内容,详见视频部分。
【END】
近期热文blog