Redis的慢查询日志,用于记录执行时间超过给定时长的命令请求,用户可以通过这个日志来监视和优化查询速度。

服务器有两个选项和慢查询有关:

  • slowlog-log-slower-than,指定执行时间超过多少微妙的命令请求会被记录到日志上。
  • slowlog-max-len,指定服务器上最多保存多少条慢查询日志。数量超过,则先入先出。

SLOWLOG GET可以查看服务器保存的慢查询日志。

23.1 慢查询日志的保存

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
struct redisServer {
// 下一条日志的ID
long long slowlog_entry_id;

// 保存了所有日志的链表
lisg *slowlog;

long long slowlog_log_slower_than;
unsigned long slowlog_max_len;
};

// slowlog链表保存了所有慢查询日志,每个节点都保存了一个slowlogEntry结构,代表一条日志
typedef struct slowlogEntry {
long long id;

// 命令执行时的时间
time_t time;

// 执行命令的消耗时间,微妙级
long long duration;

// 命令与命令参数
robj **argv;

// 命令与命令参数的个数
int argc;
} slowlogEntry;

23.2 慢查询日志的阅览与删除

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def SLOTLOG_GET(number=None):
# 用户没有给定number惨呼,那么打印全部日志
if number is None:
number = SLOWLOG_LEN()

# 遍历所有日志
for log in redisServer.slowlog:
if number <= 0:
break;
else:
number -= 1
printLog(log)

def SLOTLOG_LEN():
return len(redisServer.slowlog)

def SLOWLOG_RESET():
for log in redisServer.slowlog:
deleteLog(log)

23.3 添加新日志

每次命令执行前后,程序都会记录时间戳,两者之差就是命令执行的耗时。服务器会把这个时长传递给函数slowlogPushEntryIfNeeded,它负责检查是否需要创建慢查询日志:

  1. 如果执行时长超过slowlog-log-slower-than选项,为其创建新日志,添加到slowlog链表的表头。
  2. 如果慢查询日志的长度超过了slowlog-max-len的限制,那么将多余的日志从slowlog链表删除。

导航

目录

上一章:22. 二进制位数组

下一章:24. 监视器