Redis中的慢查询日志和监视器

news2024/9/25 19:23:51

慢查询

添加新日志

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

伪代码过程

# 记录执行命令前的时间
before = unixtime_now_in_us()
# 执行命令
execute_command(argv, argc, client)
# 记录执行命令后的时间
after = unixtime_now_in_us()
# 检查是否需要创建新的慢查询日志
slowlogPushEntryIfNeeded(argv, argc, after - before)

slowlogPushEntryIfNeeded函数的作用

  • 1.检查命令的时长是否超过slowlog-log-slower-than选项设置的时间, 如果是的话,就为命令创建一个新的日志,并将新日志添加到slowlog链表的表头
  • 2.检查慢查询日志的长度是否超过slowlog-max-len选项所设置的长度,如果是的话,那么将多出来的日志从slowlog链表中删除掉

slowlogPushEntryIfNeeded函数的实现代码:

void slowlogPushEntryIfNeeded(robj **argv, int argc, long long duration) {
// 慢查询功能未开启,直接返回
if (server.slowlog_log_slower_than < 0) return ;

// 如果执行时间超过服务器设置的上限,那么将命令添加到慢查询日志
if (duration >= server.slowlog_log_slower_than)
// 新日志添加到链表表头
listAddNodeHead(server.slowlog, slowlogCreateEntry(argv, argc, duration));

// 如果日志数量过多,那么进行删除
while (listLength(server.slowlog) > server.slowlog_max_len)
listDelNode(server.slowlog, listLast(server.slowlog))

}

该函数根据传入的参数,创建一个新的慢查询日志,并将redisServer.slowlog_entry_id的值增1

例子

  • 举个例子。假设服务器当前保存的慢查询日志如图所示,如果执行以下命令:
127.0.0.1:6379> EXPIRE msg 10086
(integer) 1

服务器在执行完这个EXPIRE命令之后,就会调用slowlogPushEntryIfNeeded函数,函数将未EXPIRE命令创建一条id为7的慢查询日志,并将这条新日志添加到slowlog链表的表头如图所示.注意,除了slowlog链表发生了变化之外,slowlog_entry_id的值也从7变为8了,之后,slowlogPushEntryIfNeeded函数发现,服务器设定的最大慢查询日志数目为5条,而服务器目前保存的慢查询日志数目为6条,于是服务器将id为2的慢查询日志删除,让服务器的慢查询日志数量回到设定好的5条
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

监视器

概述。

通过执行MONITOR命令,客户端可以将自己变为一个监视器,实时地接收并打印出服务器当前处理的命令请求的相关信息:

127.0.0.1:6379> MONITOR
OK
1713790637.787549 [0 127.0.0.1:60753] "PING"
1713790641.908992 [0 127.0.0.1:60753] "SET" "k1" "v1"
1713790645.044945 [0 127.0.0.1:60753] "SET" "k2" "v2"

每当一个客户端服务器发送一条命令请求时,服务器除了会处理这条命令请求之外,还会将关于这条命令请求的信息发送给所有监视器,如图所示
在这里插入图片描述

成为监视器

发送MONITOR命令可以让一个普通客户端变为一个监视器,该命令的实现原理可以用以下伪代码来实现:

def MONITOR():
# 打开客户端的监视器状态
client.flags |= REDIS_MONITOR

# 将客户端添加到服务器状态的monitors链表的末尾
server.monitor.append(client)

# 向客户端返回OK
send_reply("OK")

例子

  • 举个例子,如果客户端c10086向服务器发送MONITOR命令,那么这个客户端的REDIS_MONITOR标志会被打开,并且这个客户端本身会被添加到monitors链表的表尾。假设客户端c10086发送MONITOR之前,
    monitors链表的状态如图所示,那么在服务器执行客户端c10086发送的MONITOR命令之后,monitors链表将被更新为如图所示的状态
    在这里插入图片描述

向监视器发送命令信息

服务器在每次处理命令请求之前,都会调用replicationFeedMonitors函数,由这个函数将被处理的命令请求的相关信息发送给各个监视器。以下是replicationFeedMonitors函数的伪代码定义,函数首先根据传入的
参数创建信息,然后将信息发送给所有监视器:

def replicationFeedMOnitors(client, monitors, dbid,argv, argc):
# 根据执行命令的客户端、当前数据库的号码、命令参数、命令参数个数等参数
# 创建要发送给各个监视器的信息
msg = create_message(client, dbid, argv, argc)

# 遍历所有监视器
for monitor in monitors:
# 将信息发送给监视器
send_message(monitor, msg)

例子

  • 举个例子,假设服务器在时间1713791641.329412,根据IP为127.0.0.1、端口号为56604的客户端发送的命令请求,对0号数据库执行命令KEYS*,那么服务器将创建以下信息:
1713791641.329412 [0 127.0.0.1:56604] "KEYS" "*"

如果服务器monitors链表的当前状态如图上如c10086执行命令之后所示,那么服务器会分别将信息发送给c128、c256、c512和c10086四个监视器,如图所示
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1615643.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Git】生成patch和应用patch

生成patch 将本地所有修改打成补丁 git diff > /tmp/xxx.patch将本地对某个文件的修改打成补丁 git diff test/1.txt > /tmp/1.patch将某一次提交的修改内容打成补丁 -1表示只为单个提交创建patch&#xff0c;-o表示输出patch的文件夹路径&#xff0c;默认是用提交的…

[LitCTF 2023]PHP是世界上最好的语言!!、 [LitCTF 2023]Vim yyds、 [羊城杯 2020]easycon

目录 [LitCTF 2023]PHP是世界上最好的语言&#xff01;&#xff01; [LitCTF 2023]Vim yyds [羊城杯 2020]easycon [LitCTF 2023]PHP是世界上最好的语言&#xff01;&#xff01; 无参&#xff0c;根据题目提示看看php能否执行——返回1执行成功 用system()函数调用、执行ls …

【每周精选资讯 | 第 6 期】2024-04-15 ~ 2024-04-21

目录 前言内容国家天文台推出新一代天文大模型“星语3.0”李飞飞团队发布《2024年人工智能指数报告》&#xff0c;揭示AI十大趋势百度发布新一代智能计算操作系统“万源”刘强东AI数字人“采销东哥”亮相直播抖音与美团在AI赋能本地生活服务领域的竞争与合作联想发布AI PC系列产…

说话的艺术

目录&#xff1a; 1、询问术 2、说话的逻辑性 1、询问术 询问类似于从对方检索出你想要得到的事情&#xff0c;做好笔记也是很有必要的&#xff0c;故将“询问术”放于此处。 把握&#xff1a;26/F*4超级询问 2&#xff1a;带着两岁孩童的好奇心去提问 6&#xff1a;使用…

SpringCloud系列(9)--将服务消费者Consumer注册进Eureka Server

前言&#xff1a;上一章节我们介绍了如何将服务提供者注册进Eureka服务里&#xff0c;本章节则介绍如何将服务消费者Consumer注册进Eureka服务里 Eureka架构原理图 1、修改consumer-order80子模块的pom.xml文件&#xff0c;引入Eureka Clinet的依赖&#xff0c;然后reolad一下&…

Springboot 初始化操作

文章目录 程序启动后的初始化ApplicationRunner 接口CommandLineRunner 接口ApplicationRunner 和CommandLineRunner 的区别 Bean的实例化InitializingBean 接口PostConstruct注解BeanInitializingBean 接口、PostConstruct注解、Bean注解区别 总结 前些天发现了一个巨牛的人工…

晨控电子纸,工业无纸化新方案

一款好的产品&#xff0c;应该用心的去介绍。随着工业科技不断的迭代&#xff0c;生产车间自动化程度越来越高&#xff0c;但很多工序还是需要人员去更换&#xff0c;确认生产流程单。由于人员确认流程单的不确定性&#xff0c;很有可能出现流程单信息错误&#xff0c;下一工序…

Excel文件解析--超大Excel文件读写

使用POI写入 当我们想在Excel文件中写入100w条数据时&#xff0c;我们用普通的XSSFWorkbook对象写入时会发现&#xff0c;只有在将100w条数据全部加载入内存后才会用write()方法统一写入&#xff0c;这样效率很低&#xff0c;所以我们引入了SXSSFWorkbook进行超大Excel文件的读…

《ElementUI 基础知识》png 图片扩展 icon用法

前言 UI 设计给的切图是 .png 格式。但想与 Element UI icon 用法类似&#xff0c;方案如下。 实现 步骤一 准备图片 步骤二 新建文件&#xff0c;可使用 CSS 预处理语言 styl 或 scss。 stylus 方式 文件 icon.styl /* 定义一个混合 */ cfgIcon(w, h) {display: inlin…

二叉搜索树中的搜索(力扣700)

解题思路&#xff1a;因为二叉搜索树的左小右大特点&#xff0c;中只是寻找比较目标&#xff0c;怎么序遍历都可以&#xff0c;终止条件就是遍历完毕和找到了&#xff0c;然后就遍历左右子树开始寻找就好了 具体代码如下: class Solution { public: TreeNode* searchBST(Tre…

Java入门四步走

1. 简单的入门语法&#xff1a; 1.1 数据类型&#xff1a; 基本数据类型&#xff1a; 整数类型 —— byte、short、int、long, 浮点类型 —— float、double 字符类型 —— char 布尔类型 —— boolean 引用数据类型&#xff1a; 接口&#xff08;interface&#xff09;、数…

上市公司-企业数据要素利用水平数据集及参考文献(2010-2022年)

01、数据介绍 企业数据要素利用水平是指企业在其生产经营活动中&#xff0c;对数据的收集、处理、分析和应用的能力及效果。这种利用水平的高低直接反映了企业在数字化时代中的竞争力和创新能力。 本数据参考《中央财经大学学报》史青春&#xff08;2023&#xff09;老师的研…

芒果超媒的“乘风破浪”,差了一点市场海浪的反馈

4月21日晚间&#xff0c;芒果超媒发布了2023年度&2024一季度报告。 芒果超媒2023年实现营业收入146.28亿元&#xff0c;同比增长4.66%&#xff1b;净利润35.56亿元&#xff0c;同比增长90.73%&#xff1b;基本每股收益1.90元。公司拟每10股派发现金红利1.8元。2024年第一季…

使用gdal均匀筛选点矢量

使用gdal均匀筛选点矢量 作用&#xff1a; 通过计算各点之间的欧式距离&#xff0c;筛选出符合目标的、均匀发布在空间中的N个数据点。 效果示意图 运行环境 python 3.10 安装&#xff1a;tqdm、numpy和tqdm这三个库 完整代码 import numpy as np from osgeo import ogr,…

291个地级市资源错配指数、劳动和资本相对扭曲指数(2006-2021年)

01、数据介绍 资源错配指数&#xff08;Misallocation Index&#xff09;是一个用于衡量资源配置效率的指标&#xff0c;它衡量的是生产要素的配置是否合理&#xff0c;是否达到了最优的状态。资源错配指数越高&#xff0c;资源的利用效率越低。资源错配指数主要用于衡量各种生…

没想到打脸这么快,AI程序员已经出发了!

大家好啊&#xff0c;我是豆小匠。 先介绍一下本期的主角&#xff1a;Devin&#xff0c;世界上第一位AI程序员&#xff0c;由2023年11月成立的10人初创公司Cognition AI开发。 1. AI程序员已经能做到什么程度 3月13日&#xff0c;Cognition AI公司在X平台&#xff08;原推特&…

监控员工上网记录软件 三款超好用监控员工上网的软件

监控员工上网记录软件 三款超好用监控员工上网的软件 监控员工上网聊天、打游戏、看小说等特定行为的软件通常属于员工监控或上网行为管理软件类别。这类软件旨在帮助企业或组织管理者监督员工在工作时间内对计算机及互联网资源的使用情况&#xff0c;确保工作效率&#xff0c;…

进阶C语言-文件操作

文件操作 &#x1f388;1.为什么使用文件&#x1f388;2.什么是文件&#x1f52d;2.1程序文件&#x1f52d;2.2数据文件&#x1f52d;2.3文件名 &#x1f388;3.文件的打开和关闭&#x1f52d;3.1文件指针&#x1f52d;3.2文件的打开和关闭 &#x1f388;1.为什么使用文件 ✅ 我…

vue的学习之用vue写一个hello,vue

根据以下步骤下载vue.js 介绍 — Vue.js 创建一个damo.html &#xff0c;引入vue.js即可 <body><div id"app">{{ message }}</div><!-- Vue --><!-- 开发环境版本&#xff0c;包含了有帮助的命令行警告 --><script src"js/vu…

Mysql基础(二)数据类型和约束

一 数据类型 讲解主要的数据类型,不面面俱到,后续遇到具体问题再查询补充扩展&#xff1a; 知识点的深度和广度以工作为导向 ① int float M : 表示显示宽度&#xff0c;M的取值范围是(0, 255)例如: int(5),当数据宽度小于5位的时候在数字前面需要用字符填满宽度说明&…