Redis慢查询日志
前言
Redis
的命令有一个生命周期, 比如发送一个set key value
命令.
Redis
客户端发送set key value
到Redis
服务端- 因为
Redis
是单线程, 所以命令在队列中排队. Redis
服务端执行set key value
命令, 并产生结果Redis
服务端将结果发送给Redis
客户端
而Redis
命令的慢查询命令就是Redis
服务端消耗时间较长的命令, 耗时过长是导致客户端超时的原因之一.
慢查询配置
慢查询其实就是一个固定长度的FIFO
队列, 它保存在内存中.
既然是FIFO
, 那么肯定会存在旧的慢查询丢失问题, 所以需要定期进行持久化到硬盘.
修改配置文件重启(不推荐)
Redis
配置文件在/etc/redis.conf
下, 里面有两个属性.
1 | # 超过 10000 微秒的命令会被记录下来, 为0则记录所有命令, 为负数则禁用慢查询日志 |
实际我们不这样做, 因为Redis
支持动态配置.
动态配置
Redis
可以通过命令, 将配置写入内存中, 再调用config rewrite
回写到配置文件中.
1 | redis-cli |
注意! 如果Redis Server
启动时没有指定配置文件, 则config rewrite
会报错!
所以需要指定配置文件
1 | redis-server /etc/redis.conf |
Docker 配置
如果是Docker
启动的话, Image
里是没有redis.conf
的, 需要自己映射volume
.
1 | # 1. 准备外部文件 |
如果是Docker-Compose
启动的话, 需要指定volume
, 然后后台启动docker-compose up -d
.
1 | # https://github.com/docker-library/redis/issues/125#issuecomment-363322332 |
慢查询命令
1 | # 1. 查看慢查询里前100条命令, 注意这里是FIFO |
可以看到慢查询日志由6
个部分组成。官方文档
条目 | 值 | 说明 |
---|---|---|
1 | (integer) 1 |
慢查询日志的id , 自增 |
2 | (integer) 1549684719 |
开始命令的unix 时间戳 |
3 | (integer) 141 |
执行命令消耗的时间, 以微秒为单位 |
4 | 1) "set" 2) "k1" 3) "v1;" |
组成命令的参数, 以数组形式存放 |
5 | "172.17.0.1:56592" |
4.0+ 新增, 客户端的ip:port |
6 | "" |
4.0+ 新增, 客户端的名称 |
最佳实践
1 | # 不要设置过大, 默认10ms, 通常设置1ms |
慢查询日志是一个FIFO
队列, 如果一段时间没有处理, 则旧的慢查询日志则会从队列移除, 所以我们需要定期持久化慢查询日志到硬盘, 通过定时任务插入MySQL
等方式.
1 | slowlog get 100 |