【Redis】 慢查询日志

Metadata

title: 【Redis】 慢查询日志
date: 2023-07-09 13:23
tags:
  - 行动阶段/完成
  - 主题场景/数据存储
  - 笔记空间/KnowladgeSpace/ProgramSpace/BasicsSpace
  - 细化主题/数据存储/Redis
categories:
  - 数据存储
keywords:
  - 数据存储/Redis
description: 【Redis】 慢查询日志

概述

Redis 的慢查询日志功能用于记录执行时间超过给定时长的命令请求。可通过两个参数配置:

  • slowlog-log-slower-than:执行时间超过多少微秒的命令会被记录到日志上。
  • slowlog-max-len:指定服务器最多保存多少条慢查询日志,超过时会删除最久的那条日志。

可以使用CONSIG SET slowlog-log-slower-than <microsecond>直接修改配置,使用SLOWLOG GET查询慢查询日志

  • Redis的慢查询日志功能用于记录执行时间超过指定时长的命令。
  • Redis服务器将所有的慢查询日志保存在服务器状态的slowlog链表中,每个链表节点都包含一个slowlogEntry结构,每个slowlogEntry结构代表一条慢查询日志。
  • 打印和删除慢查询日志可以通过遍历slowlog链表来完成。
  • slowlog链表的长度就是服务器所保存慢查询日志的数量。
  • 新的慢查询日志会被添加到slowlog链表的表头,如果日志的数量超过slowlog-max-len选项的值,那么多出来的日志会被删除。

慢查询记录的保存

相关慢查询日志的属性记录在 redisServer 中:

struct redisServer {
​
    //下一条慢查询日志的ID,初始为0,每产生一条就加1
    long long slowlog_entry_id;
    //保存了所有慢查询日志的链表
    list *slow1og;
    //服务器配置slowlog-log-slower-than选项的值
    long 1ong slowlog_1og_slower_than;
    //服务器配置slowlog-max-len选项的值
    unsigned long slowlog_max_len;
    // ...
};

slowlog 是一个链表,有几个节点就表示有几条慢查询日志,节点是一个 slowlogEntry 实例:

typedef struct slow1ogEntry {
    //唯一标识符
    long 1ong id;
    //命令执行时的时间,格式为UNIX时间戥
    time_t time;
    //执行命令消耗的时间,以微秒为单位
    1ong long duration;
    //命令与命令参数
    robj **argv;
    //命令与命令参数的数量
    int argc;
} slowlogEntry;
​

新添加的日志会呗放到 slowlog 的表头。