编程界的小学生
一、回顾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码农社区】