要理解redis的慢查询,首先要理解redis一个完整的生命周期,一个命令请求的生命周期大体分为四个步骤:发送命令->排队->执行命令->返回结果。以下图:mysql
以上就是redis请求的生命周期,因为redis采用的是 单线程 架构,因此每一个命令其实是存在排队执行的(同步阻塞)redis
这里有两点说明:sql
1.慢查询发生在第3阶段 即执行命令阶段网络
2.客户端超时不必定是慢查询致使,由于网络环境也会致使在一、4阶段的延迟。但慢查询,是客户端超时的一个可能因素。架构
设置慢查询的队列大小 : slowlog-max-len = 128 (默认值)优化
说明:redis的慢查询实际上是一个先进先出队列,且是固定长度,保存在内存当中。spa
设置慢查询的记录阀值(微秒): slowlog-log-slower-than = 10000 (默认值)线程
说明:生命周期
1.例如默认值10000,即表明命令超过10000微秒(10毫秒)就记录到慢查询队列队列
2.若是想记录全部的命令到慢查询,则将其值设为 0。
3.若是全部命令都不记录,则将其值设为 -1。
配置方法:
1.修改配置文件重启
2.使用命令动态配置 :
config set slowlog-max-len 1000
config set slowlog-log-slower-than 1000
slowlog get [n] --- 获取慢查询队列,n可选,表明获取多少条
slowlog len --- 获取慢查询队列长度
slowlog reset --- 清空慢查询队列
1. slowlog-max-len不要设置过大,默认10ms,一般设置为1ms
缘由:由于redis的QPS一般是万级别 而咱们redis每一个命令的平均执行时间是0.1毫秒,若是设置过大,也就是说必须10毫秒才能记录到这条命令的话,其实假设咱们命令若是超过 1 毫秒就会对咱们的系统产生影响,那么设置成10毫秒将不会记录,也就不便于咱们排查问题。
2. slowlog-log-slower-than不要设置太小,默认128 一般设置1000左右。
缘由:因为redis的慢查询队列是记录在内存当中,若是redis重启,列表将会清空。并且它是一个先进先出队列,随着咱们的慢查询不断增多,最开始记录的慢查询就会丢掉,对于咱们分析历史问题不是很方便。
3.建议按期持久化慢查询
缘由:针对第二点,咱们能够持久化到相似mysql的持久化存储介质, 便于咱们查询历史慢查询的操做,方便系统优化和排错。