慢查询日志的数据结构与API

关键字: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 */
}
慢查询日志的数据结构与API_第1张图片


慢查询日志条目
/* 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_第2张图片


三 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
 











你可能感兴趣的:(慢查询日志的数据结构与API)