慢查询
就是将查询时间长的操作记录下来。
客户端请求的生命周期:
redis请求的生命周期
如上图所示可以分为4个阶段:
a.发送命令(消耗的是网络时间)
b.命令在队列中排队等待被执行(因为redis单线程,同一时间只能处理一个命令)
c.执行命令
d.返回结果(消耗网络时间)
说明:
慢查询发生在第三阶段,也就是说慢查询算的时间是第三阶段的时间,第三阶段执行操作所花的时间超过规定时间就会记录到慢查询中。
客户端超时不一定是因为慢查询(执行操作时间过长),还可能是因为命令排队耗时或者网络传输耗时。
但慢查询是客户端超时的一个可能因素。
每一个慢查询会被放入一个固定长度的先进先出的队列,而且慢查询的结果是保存到内存中,不会进行持久化的(重启清空)。
当一个查询被redis认定为是慢查询,那么该查询会被放入这个队列,当队列的长度满了之后,先进入的慢查询会被弹出。
两个有关慢查询的配置:
slowlog-max-len # 慢查询队列长度,默认128
slowlog-log-slower-than # 执行多长时间认定为慢查询,默认10000,单位微秒。(即10ms)
slowlog-log-slower-than=0 把所有操作都当成慢查询
slowlog-log-slower-than=-1 不记录任何慢查询
可以使用 config set来动态设置这两个参数,因为redis开启之后不建议进行重启,所以不推荐通过修改配置文件的方式修改。
config set slowlog-max-len 128
慢查询命令
由于慢查询是写入到内存中,所以可以通过命令获取慢查询
slowlog get [n] # 获取n条慢查询
slowlog len # 获取共有几个慢查询
slowlog reset # 清空慢查询
运维经验:
a. slowlog-max-len不要设置过大,默认10ms,通常设置为1ms
原因:redis的QPS一般是万级别的,所以每条请求处理时间平均为0.1ms。所以设1ms为慢查询时间比较合适。
但是还是要根据实际情况,一般是根据你服务端redis的QPS而定。
b. slowlog-log-slower-than 不要设置过小,默认128,通常设为1000
c. 理解命令生命周期
d. 定期持久化慢查询
由于慢查询是存到内存中,所以重启redis会清空慢查询队列;而且慢查询数量超过队列的长度后,旧的慢查询会被弹出销毁。可以通过写脚本调用slowlog get 将慢查询写入到mysql进行长久保存。