Redis慢查询

生命周期

要理解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的持久化存储介质, 便于咱们查询历史慢查询的操做,方便系统优化和排错。

相关文章
相关标签/搜索