你知道Redis慢查询吗?

一、回顾Redis处理命令全过程

在这里插入图片描述

  • 1、发送命令
  • 2、Redis单线程,可以想象成队列,命令太多处理不过来的情况他会排队,逐个执行,但Redis可以达到每秒处理万级别的命令(前提是配置好,比如不能配置aof的always等)
  • 3、执行命令
  • 4、给客户端返回结果

二、慢查询

1、说明

慢查询发生在上图的第3阶段,也就是命令被执行所消耗的时间,比如keys *这种极其耗时的命令。命令通过网络传输所消耗的时间以及排队等待的时间不算。

2、配置

2.1、slowlog-max-len

存放慢查询语句的是一个先进先出的队列,他有固定长度,slowlog-max-len就是控制慢查询语句数量的,存放到内存中的,默认128,超过128的话会舍弃最先进入队列的命令。所以一般可以搞大点,因为他是存放到内存的,重启就没了。

slowlog-max-len 128

2.2、slowlog-log-slower-than

慢查询阈值(单位:微妙,默认是10000,也就是10毫秒)。默认是超过10ms命令没执行完就扔到慢查询队列里(上面参数控制队列大小)。Redis号称QPS万级别,所以建议设置成1000,也就是1ms。

# 默认10ms
slowlog-log-slower-than 10000
# 0代表记录所有命令
slowlog-log-slower-than 0
# 小于0代表不记录任何命令
slowlog-log-slower-than -1

2.3、动态配置

多态更改配置,不需要重启Redis即可让慢日志配置的修改失效。

config set slowlog-max-len 1000
config set slowlog-log-slower-than 1000

3、慢查询命令

命令 描述
slowlog get [n] 获取慢查询队列的前n条
slowlog len 获取慢查询队列长度
slowlog reset 清空慢查询队列

三、实操

(1)动态配置时间为0,代表每条命令都视为慢查询

config set slowlog-max-len 1000
config set slowlog-log-slower-than 0

(2)随便写几个命令

keys *
get k1

(3)看慢查询队列

127.0.0.1:6379> slowlog len
(integer) 3
127.0.0.1:6379> SLOWLOG get 3
1) 1) (integer) 4
   2) (integer) 1585794916
   3) (integer) 12
   4) 1) "get"
      2) "k1"
   5) "127.0.0.1:41242"
   6) ""
2) 1) (integer) 3
   2) (integer) 1585794914
   3) (integer) 22
   4) 1) "keys"
      2) "*"
   5) "127.0.0.1:41242"
   6) ""
3) 1) (integer) 2
   2) (integer) 1585794904
   3) (integer) 5
   4) 1) "SLOWLOG"
      2) "reset"
   5) "127.0.0.1:41242"
   6) ""

四、个人建议

  • slowlog-max-len:不要设置过大,默认10ms,建议设置1ms。
  • slowlog-log-slower-than:不要设置过小,建议设置1000左右
  • 定期持久化慢查询。因为slowlog-max-len这个队列是放到内存里的,重启就没了,而且有长度限制,所以我们要查的慢命令多的话根本不显示,会丢失命令。所以可以用第三方插件持久化到mysql或者自己写个脚本持久化到mysql或者文件。

五、个人公众号

微信公众号【Java码农社区】
在这里插入图片描述

发布了47 篇原创文章 · 获赞 41 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/ctwctw/article/details/105262107