Redis慢查询日志功能是用于记录执行时间超过给定时长的命令请求,可以通过查看慢查询日志来监控和优化查询速度
例如,该值设为100,则执行时间超过100微秒的命令会被记录到慢查询日志中
先看下服务器现在的默认配置
可以发现我的服务器配置的慢查询日志的时间的10ms,慢日志的条数是 128
通过 slowlog get 查看慢查询日志是什么样子?【从其他redis服务器看的】
我们在前面已经介绍过,当慢查询日志的条数超过最大值时,采用 先进先出 的方式删除最老的慢查询日志
下面我们通过修改慢查询日志的配置来演示下 慢日志的删除是先进先出
把 slowlog-log-slower-than 设为0,这样任何redis的命令都会被当做慢查询命令添加到慢查询日志中
把 slowlog-max-len 设为 2,这样慢查询日志大小为2
配置完后,看下图
在客户端发送3条redis的命令,这样就能验证删除逻辑
先发送2条命令,然后看下慢查询日志,如下图所示
因我们配置的slowlog-max-len是2,所以当我在发送redis命令的时候,慢查询日志要执行删除策略,如下图所示
可以发现慢查询日志中,已经没有了 set str1 '1' 和 set str2 '2',验证了慢查询日志删除遵循 先进先出
通过实验验证了 redis 的慢查询记录采用 先进先出 的方式删除,那么我们通过 redis 的源码 https://github.com/antirez/redis/blob/unstable/src/slowlog.c
每次执行命令前后会记录unix时间戳,两个时间戳的差就是命令执行的时间,也就是下面源码中的 duration
/* Push a new entry into the slow log.
* This function will make sure to trim the slow log accordingly to the
* configured max length. */
void slowlogPushEntryIfNeeded(client *c, robj **argv, int argc, long long duration) {
// 未开启慢查询功能,直接返回
if (server.slowlog_log_slower_than < 0) return; /* Slowlog disabled */
// 命令执行时间超过了设置的超时时间的上限,将命令添加到慢查询日志中,采用头插入的方式
if (duration >= server.slowlog_log_slower_than)
// 从头插入
listAddNodeHead(server.slowlog,
// 创建一个慢查询记录对象
slowlogCreateEntry(c,argv,argc,duration));
/* Remove old entries if needed. */
// 日志超过最值的最大值,进行删除
while (listLength(server.slowlog) > server.slowlog_max_len)
// 删除日志,删除最早添加的,即在列表尾部的
listDelNode(server.slowlog,listLast(server.slowlog));
}
在 linux 部署 redis 需要服务器安装 gcc ,需要 root 权限,所以我采用 docker 方式部署,比较方便
如果是win本用 winpty docker exec -it b29f7ba42310 redis-cli