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

本文介绍了Redis慢查询日志的工作原理和技术实现细节。包括慢日志的数据结构、API操作及客户端命令使用方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关键字: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
 











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值