Table of Contents generated with DocToc
Redis的慢查询日志,用于记录执行时间超过给定时长的命令请求,用户可以通过这个日志来监视和优化查询速度。
服务器有两个选项和慢查询有关:
slowlog-log-slower-than
,指定执行时间超过多少微秒的命令请求会被记录到日志上。slowlog-max-len
,指定服务器上最多保存多少条慢查询日志。数量超过,则先入先出。
SLOWLOG GET
可以查看服务器保存的慢查询日志。
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;
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)
每次命令执行前后,程序都会记录时间戳,两者之差就是命令执行的耗时。服务器会把这个时长传递给函数slowlogPushEntryIfNeeded
,它负责检查是否需要创建慢查询日志:
- 如果执行时长超过
slowlog-log-slower-than
选项,为其创建新日志,添加到slowlog
链表的表头。 - 如果慢查询日志的长度超过了
slowlog-max-len
的限制,那么将多余的日志从slowlog
链表删除。
上一章:22、二进制位数组
下一章:24、监视器.md