关闭

慢查询日志

90人阅读 评论(0) 收藏 举报
分类:

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

两个服务器配置选项:

  1. slowlog-log-slower-than 选项:指定执行时间超过多少微妙的命令请求会被记录到日志上。
  2. slowlog-max-len 选项:指定服务器最多保存多少条慢查询日志。
redis> CONFIG SET slowlog-log-slower-than 10
OK

redis> CONFIG SET slowlog-max-len 5
OK

获取慢查询日志:

redis> SLOWLOG GET

1. 慢查询记录的保存

服务器状态redisServer结构中包含慢查询日志功能的相关属性:

struct redisServer{
    //...

    //下一条慢查询日志的ID
    long long slowlog_entry_id;

    //保存了所有慢查询日志的链表
    list *slowlog;

    //服务器配置项slowlog-log-slower-than
    long long slowlog_log_slower_than;
    //服务器配置项 slowlog-max-len
    long long slowlog-max-len;

    //...
};

这里写图片描述

slowlog.h/slowlogEntry结构:

/* This structure defines an entry inside the slow log list */
/*
 * 慢查询日志
 */
typedef struct slowlogEntry {

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

    // 命令与命令参数的数量
    int argc;

    // 唯一标识符
    long long id;       /* Unique entry identifier. */

    // 执行命令消耗的时间,以微秒为单位
    // 注释里说的 nanoseconds 是错误的
    long long duration; /* Time spent by the query, in nanoseconds. */

    // 命令执行时的时间,格式为 UNIX 时间戳
    time_t time;        /* Unix time at which the query was executed. */

} slowlogEntry;

这里写图片描述

慢查询方法:

/* Exported API */
void slowlogInit(void);
void slowlogPushEntryIfNeeded(robj **argv, int argc, long long duration);

/* Exported commands */
void slowlogCommand(redisClient *c);

2. 慢查询日志的阅览和删除

SLOWLOG GET 命令:查看慢查询日志
SLOWLOG LEN 命令:查看日志数量
SLOWLOG RESET 命令:清除所有慢查询日志

3. 添加新日志

slowlog.h/slowlogPushEntryIfNeeded函数:

/* Push a new entry into the slow log.
 *
 * 如果参数 duration 超过服务器设置的上限时间,
 * 那么将一个新条目以 FIFO 顺序推入到慢查询日志中。
 *
 * This function will make sure to trim the slow log accordingly to the
 * configured max length. 
 *
 * 根据服务器设置的最大日志长度,可能会对日志进行截断(trim)
 */
void slowlogPushEntryIfNeeded(robj **argv, int argc, long long duration/*服务器执行命令所耗费的时长*/) {

    // 慢查询功能未开启,直接返回
    if (server.slowlog_log_slower_than < 0) return; /* Slowlog disabled */

    // 如果执行时间超过服务器设置的上限,那么将命令添加到慢查询日志
    if (duration >= server.slowlog_log_slower_than)
        // 新日志添加到链表表头
        listAddNodeHead(server.slowlog,slowlogCreateEntry(argv,argc,duration));

    /* Remove old entries if needed. */
    // 如果日志数量过多,那么进行删除
    while (listLength(server.slowlog) > server.slowlog_max_len)
        listDelNode(server.slowlog,listLast(server.slowlog));
}
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:57433次
    • 积分:2160
    • 等级:
    • 排名:第17633名
    • 原创:166篇
    • 转载:21篇
    • 译文:2篇
    • 评论:5条
    最新评论