Redis 笔记六 慢查询日志

慢查询设置
redis.conf 中可以配置和慢查询日志相关的选项:
#执行时间超过多少微秒的命令请求会被记录到日志上 0 :全记录 <0 不记录 
slowlog-log-slower-than 10000 
#slowlog-max-len 存储慢查询日志条数 
slowlog-max-len 128
Redis 使用列表存储慢查询日志,采用队列方式( FIFO)
 
慢查询记录的保存
redisServer 中保存和慢查询日志相关的信息
struct redisServer { 
    // ... 
    // 下一条慢查询日志的 ID 
    long long slowlog_entry_id; 
    // 保存了所有慢查询日志的链表 FIFO 
    list *slowlog; 
    // 服务器配置 slowlog-log-slower-than 选项的值 
    long long slowlog_log_slower_than; 
    // 服务器配置 slowlog-max-len 选项的值 
    unsigned long slowlog_max_len; 
    // ... 
};
lowlog 链表保存了服务器中的所有慢查询日志, 链表中的每个节点都保存了一个 slowlogEntry 结 构, 每个 slowlogEntry 结构代表一条慢查询日志。
typedef struct slowlogEntry { 
    // 唯一标识符
    long long id; 
    // 命令执行时的时间,格式为 UNIX 时间戳
    time_t time;
    // 执行命令消耗的时间,以微秒为单位 
    long long duration;
    // 命令与命令参数 
    robj **argv; 
    // 命令与命令参数的数量 
    int argc; 
} slowlogEntry;
慢查询日志的阅览 &删除
初始化日志列表
void slowlogInit(void) { 
    server.slowlog = listCreate(); /* 创建一个list列表 */ s
    erver.slowlog_entry_id = 0; /* 日志ID从0开始 */
    listSetFreeMethod(server.slowlog,slowlogFreeEntry); /* 指定慢查询日志list空间 的释放方法 */ 
   }
获得慢查询日志记录
slowlog get [n]
def SLOWLOG_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)
查看日志数量的 slowlog len
def SLOWLOG_LEN(): 
    # slowlog 链表的长度就是慢查询日志的条目数量 
    return len(redisServer.slowlog)
清除日志 slowlog reset
def SLOWLOG_RESET(): 
    #遍历服务器中的所有慢查询日志 
    for log in redisServer.slowlog: 
        # 删除日志 
        deleteLog(log)

添加日志实现
在每次执行命令的之前和之后, 程序都会记录微秒格式的当前 UNIX 时间戳, 这两个时间戳之间的差就是服务器执行命令所耗费的时长, 服务器会将这个时长作为参数之一传给slowlogPushEntryIfNeeded
函数, 而 slowlogPushEntryIfNeeded 函数则负责检查是否需要为这次执行的命令创建慢查询日志

// 记录执行命令前的时间 
before = unixtime_now_in_us() 
//执行命令 
execute_command(argv, argc, client) 
//记录执行命令后的时间 
after = unixtime_now_in_us() 
// 检查是否需要创建新的慢查询日志 
slowlogPushEntryIfNeeded(argv, argc, before-after) 
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)); /* 创建一个slowlogEntry对象,添加到列表首部*/ 
    while (listLength(server.slowlog) > server.slowlog_max_len) /* 如果列表长度 > 指定长度 */
            listDelNode(server.slowlog,listLast(server.slowlog)); /* 移除列表尾部元素 */
}
slowlogPushEntryIfNeeded 函数的作用有两个:
1. 检查命令的执行时长是否超过 slowlog - log - slower - than 选项所设置的时间, 如果是的话, 就为命令创建一个新的日志, 并将新日志添加到 slowlog 链表的表头
2.
检查慢查询日志的长度是否超过 slowlog - max - len 选项所设置的长度, 如果是的话, 那么将多出来的日志从 slowlog 链表中删除掉。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值