《Redis设计与实现》读书笔记(三十六) ——Redis 慢查询日志实现

《Redis设计与实现》读书笔记(三十六) ——Redis 慢查询日志实现

(原创内容,转载请注明来源,谢谢)

一、基本功能

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

redis服务器中,有两个配置选项与此相关。

1)slowlog-log-slower-than,该选项确定超过多少微秒的命令请求,会被记录到日志。

2)slowlog-max-len,该选项指定服务器最多保存多少条慢查询日志。超出这个条数的,则会先删除最旧的一条日志,再新增一条日志。

可以用config setslowlog-log-slower-than 100来设置超过100毫秒的命令,或config set slowlog-max-len 100来设置慢查询日志最多纪录100条等。

可以通过sloglogget,来获取当前的慢查询日志。

二、慢查询记录的保存

服务器状态中,有几个和慢查询相关的属性,保存在redisServer结构体中。

struct redisServer{
//....其他内容
long long slowlog_entry_id;//下一条慢查询日志的id
list *slowlog;//所有慢查询日志的链表
long long slowlog-log-slower-than;//服务器配置的slowlog-log-slower-than值
unsigned long slowlog-max-len;//服务器配置的slowlog-max-len值
};

slowlog_entry_id初始化的值是0,每创建一条新的慢查询日志,这个属性的值就会变成最新的日志id的值,之后每创建一个慢查询日志,程序会对这个属性的值增1,作为新的慢查询日志的id。

slowlog链表,保存了服务器中所有的慢查询日志,链表中的每一个节点,就是一个slowlogEntry结构,每个结构代表一个慢查询日志。

typedef struct slowlogEntry{
long long id;//唯一标识符
time_t time;//命令执行时间,是unix时间戳
long long duration;//命令执行消耗时间,毫秒为单位
robj **argv;//命令与命令参数
int argc;//命令数量
}slowlogEntry;

例如下图的慢查询日志:

其slowlogEntry结构如下图所示:

整体属性如下图所示:

id越大的排在链表的表头,因此slowlog链表是使用插入到表头的方式来添加新日志。

三、慢查询日志的阅览和删除

如果没有指定返回的log的数量,默认返回整个慢查询日志。如果有指定,则会返回指定数量。但是如果指定的数量超出总数量,还是会返回整个慢查询日志。

四、添加新日志

每次执行前和执行后,redis服务器都会用微秒的方式,记录unix时间戳,差距就是执行服务器命令的耗时。

这个耗时会传给slowlogPushEntryIfNeeded函数,用于判断是否需要将查询命令记录到慢查询日志,以及目前的日志长度是否超出设定的范围,再将slowlog_entry_id值加1。

五、总结

1、慢查询功能用于记录执行时间超过设定时间的命令,可以通过配置文件配置需要记录的命令执行时间,单位是毫秒;配置慢查询日志的总记录数,超出这个数会删除最旧的日志后,添加一条新记录。

2、打印和删除慢查询日志可以通过遍历slowlog链表完成,该链表的长度就是保存慢查询日志的数量。新的日志会添加到表头,这样以便于如果链表长度超出总的长度,删除最旧的日志。

——written by linhxx 2017.10.02

原文发布于微信公众号 - 决胜机器学习(phpthinker)

原文发表时间:2017-10-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Go入门系列

Botposter.com集群ETCD2.3.7升级至3.0实录

7月1日,ETCD隆重发布了3.0版本。Botposter.com也在第一时间对集群进行了升级。本文是升级过程的记录与总结(文中假设读者已经使用或测试过ETCD...

782
来自专栏小狼的世界

[每天五分钟,备战架构师-5]操作系统之文件管理

操作系统实现了对系统硬件资源和软件资源的管理,其中软件资源主要是各种系统程序、用户应用程序,还包括大量的文档材料,这些软件资源在操作系统中大多以文件的形式存储。...

633
来自专栏开发与安全

linux网络编程之socket(五):tcp流协议产生的粘包问题和解决方案

我们在前面曾经说过,发送端可以是一K一K地发送数据,而接收端的应用程序可以两K两K地提走数据,当然也有可能一次提走3K或6K数据,或者一次只提走几个字节的数据,...

2070
来自专栏跟着阿笨一起玩NET

怎么样看主板支持最大内存

转载:http://jingyan.baidu.com/article/ab0b5630a869cdc15afa7d19.html

322
来自专栏Linux驱动

12.Linux之输入子系统分析(详解)

在此节之前,我们学的都是简单的字符驱动,涉及的内容有字符驱动的框架、自动创建设备节点、linux中断、poll机制、异步通知、同步互斥/非阻塞、定时器去抖动。 ...

2076
来自专栏程序员叨叨叨

一招搞定Windows无法安装到GPT分区形式磁盘疑难

今天给堂弟的电脑重装系统时,遇到了以往USB安装系统经常出现的问题,“Windows无法安装到这个磁盘。选中的磁盘采用GPT分区形式”。之前在CSDN的博客上有...

412
来自专栏蓝天

mooon-agent接收状态机代码摘要

802
来自专栏蓝天

Linux系统面面观 PROC文件系统详细介绍

什么是proc文件系统? proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。用户和应用...

752
来自专栏性能与架构

Redis 开启monitor监视器的性能消耗

之前介绍了redis的monitor,今天有朋友问monitor是否能长时间开启,我知道monitor会有较大性能开销,但不清楚具体消耗的程度,就测试了一下 ...

3335
来自专栏H2Cloud

FFLIB C++ 异步&类型安全&printf风格的日志库

摘要       C++程序的调试一般有调试器、printf、日志文件三种。Linux下的调试器为gdb,关于gdb的使用甚至可以单独用一本书来说明,但是本章并...

3428

扫描关注云+社区