关键字:slowlog
一 介绍
源码参考
redis-3.0.5/Redis.h
redis-3.0.5/Slowlog.h
redis-3.0.5/Slowlog.c
Redis的慢日志查询用于记录执行时间超过指定时长的命令。
命令执行前会记录一个时间戳,执行完后会记录一个时间戳,两者相减就是命令执行时间(微妙)。
Redis服务器将所有的慢查询日志保存在服务器状态的slowlog链表中,每个链表节点都包含一个slowlogEntry结构,每个slowlogEntry结构代表一个慢查询条目。
慢查询日志是插入到链表头的;
插入完毕后,检查是否超过链表长度,如果是,就删除链表尾部的结点;
打印和删除慢查询日志都是通过遍历链表来做的。
slowlog链表的长度就是服务器保存的慢查询日志的数量。
二 数据结构
服务器状态中,关于慢查询日志的代码。
struct redisServer {
// 保存慢查询日志的链表
list *slowlog; /* SLOWLOG list of commands */
// 慢查询日志的下一个 id 值
long long slowlog_entry_id; /* SLOWLOG current entry ID 不是current,其实是下一个慢日志条目会取用的id,取用完后会++ */
// 查询时间占用超过该微妙会被记录
long long slowlog_log_slower_than; /* SLOWLOG time limit (to get logged) */
// 慢查询链表的最大条目数量
unsigned long slowlog_max_len; /* SLOWLOG max number of items logged */
}
慢查询日志条目
/* This structure defines an entry inside the slow log list */
// 慢查询链表每个节点,会保存慢查询条目的结构体
typedef struct slowlogEntry {
// 命令与命令参数
robj **argv;
// 命令与命令参数的数量
int argc;
// 慢查询条目唯一标识符
long long id; /* Unique entry identifier. */
// 执行命令消耗的时间,微妙
long long duration; /* Time spent by the query, in nanoseconds. */
// 命令执行时的unix时间戳
time_t time; /* Unix time at which the query was executed. */
} slowlogEntry;
三 API
slowlogCreateEntry()
根据传入的参数,如命令与参数,以及命令参数的数量,持续时间等,创建一个新的慢查询条目,并返回它
slowlogFreeEntry()
传进指向慢查询条目的指针作为参数,释放该 慢查询条目 的内存
slowlogInit() 创建慢查询日志链表,该函数应该在服务器初始化时只执行一次
slowlogReset()
清除慢查询链表的所有条目
slowlogPushEntryIfNeeded() 将命令以及其参数,命令耗时作为参数传入,判断其是否有必要插入到慢日志链表,
如果是则插入到链表头,并删除过长的链表尾
slowlogCommand()
被客户端发出的慢查询命令的处理
注意:这里的api,还是对于各层结构的增删查改
四 客户端命令
设置伐值与队列长度
config set slowlog-log-slower-than 0
config set slowlog-max-len 5
查询慢日志
slowlog get [number]
注意:先打印出来的是链表头,即最近当前的条目
查看当前慢日志的数量
slowlog len
清空慢日志队列
slowlog reset