Skip to content

Latest commit

 

History

History
90 lines (63 loc) · 2.92 KB

23、慢查询日志.md

File metadata and controls

90 lines (63 loc) · 2.92 KB

Table of Contents generated with DocToc

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

服务器有两个选项和慢查询有关:

  • slowlog-log-slower-than,指定执行时间超过多少微秒的命令请求会被记录到日志上。
  • slowlog-max-len,指定服务器上最多保存多少条慢查询日志。数量超过,则先入先出。

SLOWLOG GET可以查看服务器保存的慢查询日志。

23.1 慢查询日志的保存

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;

23.2 慢查询日志的阅览与删除

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)

23.3 添加新日志

每次命令执行前后,程序都会记录时间戳,两者之差就是命令执行的耗时。服务器会把这个时长传递给函数slowlogPushEntryIfNeeded,它负责检查是否需要创建慢查询日志:

  1. 如果执行时长超过slowlog-log-slower-than选项,为其创建新日志,添加到slowlog链表的表头。
  2. 如果慢查询日志的长度超过了slowlog-max-len的限制,那么将多余的日志从slowlog链表删除。

导航

目录

上一章:22、二进制位数组

下一章:24、监视器.md