Redis(三十九):认识慢查询日志

Redis性能优化 此时的主线程依旧会接收写请求,紧接着,主线程又需要把数据写到文件内存中(write 系统调用),当主线程使用后台子线程执行了一次 fsync,需要再次把新接收的操作记录写回磁盘时,如果主线程发现上一次的 fsync 还没有执行完,那么它就会阻塞。需要注意的是,Redis 的淘汰数据的逻辑与删除过期 key 的一样,也是在命令真正执行之前执行的,也就是说它也会增加我们操作 Redis 的延迟,而且,写 OPS 越高,延迟也会越明显。如果是 never,就表示,内存大页机制被禁止。 阅读详情

在Redis配置文件中,有两个选项是跟慢查询日志有关的
在这里插入图片描述
分别为

  • slowlog-log-slower-than
  • slowlog-max-len

配置选项

slowlog-log-slower-than

这个选项指定执行时间超过多少微秒的命令请求会被记录到慢查询日志上,相当于定义了命令执行的时间超过多少时,就会定义为慢查询

slowlog-max-len

这个选项指定服务器最多保存多少条慢查询日志

相关命令

config set slowlog-log-slowere-than <微秒> //设置定义慢查询的时间
config set slowlog-max-len <数量> //设置定义慢查询最多记录数量
slowlog get //查询慢查询日志

在这里插入图片描述
这里首先将定义事件改为0,将数量显示为3条
在这里插入图片描述
由于我服务器搭了集群,所以这里显示的都是集群命令的信息,可以看到,他都被限制为3条,如果后面再重新发现了出现慢查询,那么最前面的一条将会被删除,后面的往前面移,腾出空位给新出现的慢查询日志

慢查询记录的保存

慢查询记录是保存在服务器状态里面的

在服务器状态中包含了几个和慢查询日志功能有关的属性

struct redisServer(
	//...
    //下一条慢查询日志的ID
    long long slowlog_entry_id;
    
    //保存了所有慢查询日志的链表
    list *slowlog;
    
   	//服务器配置slowlog-log-slower-than选项的值
    long long slowlog_log_slower_than;
    
    //服务器配置slowlog-max-len选项的值
    unsigned long slowlog_max_len;
    //...
)redisServer;

slowlog_entry_id

slowlog_entry_id就是日志id,初始值为0,每当创建一条新的慢查询事务日志时,这个属性的值就会用作新日志id值,之后程序会对他进行加一

slowlog

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

typedef struct slowlogEntry(
	//唯一标识符
    long long id;
    //命令执行的时间,为Unix时间戳
    time_t time;
    //执行命令消耗的时间,以微秒为单位
    long long duration;
    //命令与命令参数
    robj **argv;
    //命令与命令参数的数量
    int arac;
)slowlogEntry;

该结构如下所示

在这里插入图片描述
argv是一个字符串数组,之前已经说过

看看完整的slowlog
在这里插入图片描述
slowlog采用的是头插法(新的慢查询日志在前面),所以slower-max-len参数对应的就是链表的长度

慢查询日志的阅览和删除

阅览

阅览使用的命令为

slowlog get

伪代码如下

def slowlog_get(number=None):
	#用户没有给定Number参数
	#那么就代表打印服务器包含的全部慢查询日志
	if number is None:
		#SLOWLOG_LEN()对应的就是slowlog-max-len选项、
		number = SLOWLOG_LEN();
	#遍历服务器中的慢查询日志
	for log in redisServer.slowLog:
		if number <= 0:
			#记录打印的数量,如果为0,代表打印数量足够了
			break;
		else:
			#打印的数量减一
			number -= 1;
			#打印日志
			printLog(log);
	end For
end slowlog_get;

SLOWLOG_LEN函数其实返回的就是slowog-max-len选项的值,也就是slowlog链表最大的长度

删除

清除慢查询日志可以使用下面命令

slowlog reset

其实就是遍历slowlog链表,然后进行逐个释放即可

def SLOWLOG_RESET():
	#遍历服务器中的所有慢查询日志
	for log in redisServer.slowlog:
		#删除日志
		deleteLog(log);
	end For
end SLOWLOG_RESET;

添加新日志

在每一次执行命令的之前和之后,程序都会记录微秒格式的当前UNIX时间戳,这两个时间戳之间的差就是服务器执行命令所耗费的时长,服务器会把这个时长作为参数之一传给slowlogPushEntryIfNeeded函数,也就是说,当执行完命令后,会调用slowlogPushEntryIfNeeded函数来判断当前命令是否需要添加到慢查询日志(如果需要的话,这个函数也会进行调用方法添加慢查询日志)

slowlogPushEntryIfNeeded检查的步骤如下

  1. 先判断slowlog-log-slower-than是否大于等于0,如果不是,就代表没有开启慢查询功能,如果是,代表开启了慢查询功能,紧接着后面的判断

  2. 检查命令的执行时长是否超过slowlog-log-slower-than选项,如果超过,就要为该命令新建一个slowlogEntry对象,然后新添到slowlog链表里面,采用的是头插法

  3. 之后再检查慢查询日志的长度是否超过slowlog-max-len选项设置的长度,如果超过,就要将slowLog链表中最后的slowEntry给删掉(最后的就是最久的),采用的是尾删法

伪代码表示

void slowlogPushEntryIfNeeded(robj **argv,int argc,long long duration){
    //检查记录慢查询功能是否已经开启
    //如果slowlog_log_slower_than小于0,代表不开启
    if(server.slowlog_log_slower_than < 0) return;
    
    //判断命令执行时间是否超过slowlog-log-slower-than选项
    if(duration >= server.slowlog_log_slower_than){
        //将日志添加到slowlog头部
        //调用slowlogCreateEntry生产对应的slowLogEntry对象
        listAddNodeHead(server.slowlog,slowlogCreateEntry(argv,argc,duration));
    }
    //判断日志数量是否超过slowlog-max-len
    while(listLength(server.sloglog) > server.slowlog_max_len){
        //删除最后一个slowEntry
        listDelNode(server.slowlog,listLast(server.slowlog));
    }
}

这里要注意的是,前面提到的slowlog_entry_id自增的操作是在slowlogCreateEntry函数中实现的

所以调用完listAddNodeHead方法之后,不但slowlog链表新增了一个slowlogEntry,同时服务器状态的slowlog_entry_id也完成了自增的操作

重点

  • Redis的慢查询日志功能用于记录执行时间超过指定时长的命令
  • Redis服务器将所有的慢查询日志保存在服务器状态里面的sloglog链表中
  • slowlog链表中的每一个结点都是slowlogEntry结构,每一个slowlogEntry就代表着一条慢查询日志
  • 打印和删除慢查询日志都要通过遍历slowlog链表来完成(删除也要,因为要将链表长度减少至slowlog-max-len选项)
  • slowlog链表的长度就是服务器所保存慢查询日志的数量,不一定是slowlog-max-len
  • 新的慢查询日志会被添加到slowlog链表的表头(采用头插法),删除时是先删除尾结点(采用尾删法)
Redis(三十九):认识慢查询日志(1) 一次偶然,从朋友那里得到一份“java高分面试指南”,里面涵盖了25个分类的面试题以及详细的解析:JavaOOP、Java集合/泛型、Java中的IO与NIO、Java反射、Java序列化、Java注解、多线程&并发、JVM、Mysql、Redis、Memcached、MongoDB、Spring、Spring Boot、Spring Cloud、RabbitMQ、Dubbo 、MyBatis 、ZooKeeper 、数据结构、算法、Elasticsearch 、Kafka 、微服务、Linux。 阅读详情

相关推荐

《Redis设计与实现》第23章 慢查询日志

第23章 慢查询日志 Redis的慢查询日志功能用于记录执行时间超过给定时长的命令请求,用户可以通过这个功能产生的日志来监视和优化查询速度。 服务器配置有两个和慢查询日志相关的选项: ·slowlog-log-slower-than选项指定执行时间超过多少微秒(1秒等于1 000 000微秒)的命令请求会被记录到日志上。 举个例子,如果这个选项的值为100,那么执行时间超过100微秒的命令...

jxgy01的博客 216

Redis slowlog

什么是 SLOWLOG Slow log 是 Redis 用来记录查询执行时间的日志系统。 查询执行时间指的是不包括像客户端响应(talking)、发送回复等 IO 操作,而单单是执行一个查询命令所耗费的时间。 另外,slow log 保存在内存里面,读写速度非常快,因此你可以放心地使用它,不必担心因为开启 slow log 而损害 Redis 的速度。 设置 SLOWLOG

秀才的专栏 2897

ANSYS Maxwell:从RMxprt到3D轴向磁通电机的无缝建模指南

本文详细介绍了如何利用ANSYS RMxprt作为高效起点,快速构建3D轴向磁通电机的有限元分析模型。通过RMxprt内置模板输入关键参数并完成磁路法计算后,可一键生成包含几何、材料、绕组及边界条件的即用型Maxwell 3D模型,极大简化了复杂三维结构的建模流程,使工程师能专注于性能优化与仿真分析。

weixin_29281941的博客 555

Redis学习笔记 - Slow Log 慢查询日志

什么是 SLOW LOG 1. Slow log 是 Redis 用来记录查询执行时间的日志系统。 2. 查询执行时间指的是不包括像客户端响应(talking)、发送回复等 IO 操作,而单单是执行一个查询命令所耗费的时间。 3. slow log 保存在内存里面,读写速度非常快,因此你可以放心地使用它,不必担心因为开启 slow log...

weixin_33810302的博客 583

uniapp原生安卓插件开发之路

声明: 我的功能需求:全局悬浮框,也就是在其他应用上依旧能悬浮。查遍uni文档,无法实现,甚至native.js也无法实现,无奈只能走上原生插件开发这条不归路了。(吐槽:天天写前端js,突然写了下android简直要炸,public static String啥的,var不香嘛,不过别人严谨肯定还是有别人道理的,加油吧,争取能入个门!) 本人不懂安卓开发,完全安卓小白,所以安卓方面可能表达的不是很好,安卓代码可能写的不优美,但我功能最终还是实现了。但是为了需求,能力总能被“逼”出来。有描述错误的还望指正

Jone's Area 1万+

第六章 汇川技术InoProShop入门之modbusTCP从站协议解读

摘要:ModbusTCP从站协议是Modbus协议在TCP/IP网络上的扩展,作为服务器端被动响应主站请求。它采用MBAP+PDU帧结构,通过IP地址和502端口实现网络通信,支持标准功能码(如读/写寄存器、线圈)。相比传统串行Modbus,具有高速传输、远距离通信优势。从站需解析请求、执行操作并返回响应,同时处理错误校验和并发连接。该协议广泛应用于智能传感器、PLC等工业设备,实现高效可靠的主从数据交互。

zyfucking2010的博客 1435

Redis(三十九)

学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯。所以:贵在坚持!最后再分享的一些BATJ等大厂20、21年的面试题,把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,上面只是以图片的形式给大家展示一部分。Mybatis面试专题MySQL面试专题并发编程面试专题。

q16974058的博客 849

StarWind V2V Converter v9 虚拟磁盘转换工具使用教程 (转)

StarWind V2V Converter v9.0.1.268 是一款免费的虚拟磁盘转换工具,支持不同管理程序间的虚拟机镜像格式转换,包括VMDK、VHD/VHDX、IMG和QCOW2等格式。该工具具有窗口修复模式、零拷贝转换和管理程序切换等特色功能,能够轻松实现物理机到虚拟机的转换,并兼容主流管理程序如Hyper-V、ESXi等。使用教程详细介绍了从本地文件选择到格式转换的完整操作流程,转换过程简单高效且不影响原虚拟磁盘数据。

hsh的专栏 1482

第三十九天学习心得

跨列使用会导致部分索引失效:`name` 和 `age` 之间有 `age`,跳过 `age` 直接查 `major`,只有 `name` 走索引。复合索引中,一旦出现 `>`、`<`、`BETWEEN`、`LIKE`(前缀模糊),**范围字段右边的所有条件全部失效**。理论上效率:`count(普通列)` < `count(id)` < `count(1)` ≈ `count(*)`复合索引 `(name, age, major)` 中,查询条件必须包含最左列 `name` 才能使用索引。

z23456d的博客 368

Python脚本自动化芯片设计?PyAether实战教程带你玩转EDA

本文通过PyAether实战教程,详细介绍了如何利用Python脚本实现芯片设计自动化。内容涵盖环境搭建、核心对象模型解析,并重点演示了原理图自动生成、参数化单元创建及设计验证流程集成,帮助EDA工程师从重复性手动操作中解放,显著提升设计效率与一致性。

e4f5g6h的博客 1316

KEIL调试实战:解决‘TRACE HW not present‘错误的完整指南

本文详细解析了KEIL调试中常见的'TRACE HW not present'错误,该错误通常由芯片或ST-LINK调试器不支持高级指令跟踪功能引发。文章提供了从禁用Trace功能到更新固件、检查硬件连接等完整的解决步骤,帮助开发者快速恢复STM32的正常调试,是解决KEIL调试连接问题的实用指南。

weixin_29192365的博客 360

Python通用编程规范-09 安全编程规范

1.9 安全编程规范 1.9.1 异常行为 1.9.1.1 禁止抑制或者忽略已检查异常 【说明】: 编码人员常常会通过一个空的或者无意义的catch块来抑制捕获的已检查异常。每一个catch块都应该确保程序只会在继续有效的情况下才会继续运行下去。因此,catch块必须要么从异常情况中恢复,要么重新抛出适合当前catch块上下文的另一个异常以允许最邻近的外层try-catch语句块来进行恢复工作。异常会打断应用原本预期的控制流程。例如,try块中位于异常发生点之后的任何表达式和语句都不会被执行。因此,异常必须

zhao12501的博客 2871

手把手教你搞定CAC会议投稿:从LaTeX模板到PDF eXpress避坑全流程

本文详细解析CAC会议投稿全流程,重点介绍LaTeX模板调整、Turnitin查重技巧及PDF eXpress校验避坑指南。通过实战案例和代码示例,帮助研究者高效完成IEEE格式论文投稿,避免常见技术性失误,提升投稿成功率。

weixin_29969209的博客 397

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

架构师之路--搜索业务和技术介绍及容错机制高级教程

java架构师、集群、高可用、高可扩展、高性能、高并发、性能优化、Spring boot、Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分布式项目实战   视频课程内容包含: 高级Java架构师包含:Spring boot、Spring  cloud、Dubbo、Redis、ActiveMQ、Nginx、Mycat、Spring、MongoDB、ZeroMQ

judanbgtu0882的博客 1597

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

上一篇: Redis(三十八):排序
下一篇: # git复习:基本命令使用与分支
GDUT_Ember
博客等级 码龄6年 875粉丝 190原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值