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

慢查询

添加新日志

在每次执行命令的之前和之后,程序都会记录微妙格式的当前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.mzph.cn/news/827261.shtml

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

相关文章

每日一题:Spring MVC 的执行流程是什么❓

1、用户通过浏览器向服务器发送服务请求&#xff0c;请求会被 Spring MVC 的前端控制器 DispatcherServlet 拦截。 2、DsipatcherServlet 拦截请求后&#xff0c;会调用 HandlerMapping 处理器处理映射。 3、处理器根据URL找到具体的处理器&#xff0c;生成处理器对象及处理器…

开发语言漫谈-erlang

erlang又是一个应用邻域狭窄的语言。erlang是爱立信发明的编程语言&#xff0c;它的宣传口号是&#xff1a;“如果Java是一次编写&#xff0c;到处运行&#xff0c;Erlang就是一次编写&#xff0c;永远运行&#xff01;”&#xff0c;妥妥的碰Java的流量。erlang诞生和很多语言…

网络安全数字孪生:一种新颖的汽车软件解决方案

摘要 随着汽车行业转变为数据驱动的业务&#xff0c;软件在车辆的开发和维护中发挥了核心作用。随着软件数量的增加&#xff0c;相应的网络安全风险、责任和监管也随之增加&#xff0c;传统方法变得不再适用于这类任务。相应的结果是整车厂和供应商都在努力应对汽车软件日益增加…

System Dashboard for Mac:强大的系统监控与管理工具

System Dashboard for Mac是一款专为苹果电脑设计的系统监控与管理工具&#xff0c;以其直观易用的界面和全面的功能&#xff0c;深受用户喜爱。 System Dashboard for Mac v1.10.11激活版下载 这款软件能够实时监测系统的重要参数&#xff0c;包括CPU使用率、内存利用率、硬盘…

nginxtomcat笔记

nginx是一个轻量级高性能的http和反向代理web服务器&#xff0c;优点&#xff1a;占用内存少&#xff0c;并发能力强 实验主机&#xff1a;192.168.200.141 192.168.200.142 1.虚拟主机 1.1基于域名&#xff1a;一台服务器&#xff0c;一个端口&#xff0c;部署多个网站 在ng…

yolov5 的几个问题,讲的比较清楚

yolov5, 几个问题 【BCELoss】pytorch中的BCELoss理解 三个损失函数原理讲解 https://zhuanlan.zhihu.com/p/458597638 yolov5源码解析–输出 YOLOv5系列(十) 解析损失部分loss(详尽) 1、输入数据是 xywh, 针对原图的, 然后,变成 0-1, x/原图w, y/原图h, w/原图w, h/原图h,…

51-43 DragNUWA,集成文本、图像和轨迹实现视频生成细粒度控制

微软 NWA 系列主要功能及发布时间如下&#xff1a; 22年11月&#xff0c;微软亚洲研究院、北京大学联合提出同时覆盖语言、图像和视频的统一多模态生成模型女娲NWA&#xff0c;直接包揽草图转图像、图像补全、视频预测、文字指导修改视频等8项SOTA。23年3月&#xff0c;微软亚…

LLM学习之自然语言处理简单叙述

自然语言处理基础 自然语言处理&#xff1a;让计算机读懂人所写好的这些文本&#xff0c;能够像人一样进行交互。 自然语言处理的任务和应用 任务&#xff1a; 词性标注 part of speech tagging 动词&#xff0c;名词&#xff0c;形容词&#xff1f; 命名实体的识别 name…

【Java基础】23.接口

文章目录 一、接口的概念1.接口介绍2.接口与类相似点3.接口与类的区别4.接口特性5.抽象类和接口的区别 二、接口的声明三、接口的实现四、接口的继承五、接口的多继承六、标记接口 一、接口的概念 1.接口介绍 接口&#xff08;英文&#xff1a;Interface&#xff09;&#xf…

Springboot+Vue项目-基于Java+MySQL的海滨体育馆管理系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

Mongodb支持事务吗?

一、概念 1.1、MongoDB事务简介 MongoDB 是一个非关系型数据库管理系统&#xff0c;最初并不支持事务。然而&#xff0c;随着时间的推移&#xff0c;MongoDB 在其4.0版本中引入了多文档事务支持&#xff0c;使得在单个集合中执行多个操作成为可能。 In MongoDB, an operation…

iStat Menus for Mac:强大的系统监控工具

iStat Menus for Mac是一款功能强大的系统监控工具&#xff0c;专为Mac用户设计&#xff0c;旨在帮助用户全面了解电脑的运行状态&#xff0c;提高电脑的性能和稳定性。 iStat Menus for Mac v6.73 (1239)中文版下载 该软件可以实时监测CPU使用率、内存占用、网络速度、硬盘活动…

【k8s】集群安装 Jenkins(一):实现持续集成与持续交付

【k8s】集群安装 Jenkins(一):实现持续集成与持续交付 一、 准备工作二、安装 Jenkins2.1 设置NFS共享目录2.2 创建名称空间2.3 创建持久化卷和声明2.4 创建sa账号2.5 对sa账号授权2.6 通过Deployment方式部署Jenkins2.7 查看Jenkins是否创建成功2.8 创建Jenkins-service三、…

“磁性蝴蝶”:创新结构纳米石墨烯能更精确控制自旋磁行为

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 文丨浪味仙 深度好文&#xff1a;1300字丨7分钟阅读 摘要&#xff1a;新加坡国立大学的研究团队&#xff0c;开发出一种蝴蝶形磁性纳米石墨烯&#xff0c;包含四个具有铁磁和反铁磁相互作用的不…

微信小程序:基于MySQL+Nodejs的汽车品牌管理系统

各位好&#xff0c;接上期&#xff0c;今天分享一个通过本地MySQLNodejs服务器实现CRUD功能的微信小程序&#xff0c;一起来看看吧~ 干货&#xff01;微信小程序通过NodeJs连接MySQL数据库https://jslhyh32.blog.csdn.net/article/details/137890154?spm1001.2014.3001.5502 …

gitlab 16.2.4 恢复

新创建新gitlab&#xff0c;版本需和备份的gitlab版本一致 docker run -d -p 322:22 -p 822:80 --name gitlab_1 gitlab/gitlab-ce:16.2.4-ce.0 进入容器内部 docker exec -it c51685817e27 /bin/bash 新的环境至少运行过一次&#xff0c;sudo gitlab-ctl reconfigu…

深入docker-swarm overlay网络模型

目录 1.简介 2.网络模型 3.docker_gwbridge网络 3.1.docker_gwbridge网关地址 3.2.检查docker_gwbridge网络 3.2.1.查找任务容器eth接口 3.2.2.查找ingress-sbox容器eth接口 4.检查ingress网络 4.1.检查ingress网络 4.2.检查ingress网络的命名空间 4.2.1.查找任务容…

Windows搭建Svn服务器

1、svn概述 1.1、svn简介 SVN&#xff08;Subversion&#xff09;是一个开源的版本控制系统&#xff0c;用于管理代码的版本控制和协作开发。它提供了一系列的命令行工具&#xff0c;以及一套客户端和服务器架构&#xff0c;用于管理代码的版本控制和协作。 在Windows系统&a…

python与PySpark

1、Spark是Apache基金会 下的顶级开源项目&#xff0c;用于对海量数据经行大规模的分布式技术&#xff1b; 2、P有Spark是Spark的python实现&#xff0c;用于python中完成Spark的任务开发&#xff1b; 3、安装&#xff1a;可通过cmd终端进行安装 pip install PySpark也可以通…

npm 打包后自动压缩成zip文件

在package.json里面的scripts下面的build添加 powershell -NoProfile -ExecutionPolicy Unrestricted -Command ./zip.ps1 新的build就是 "build": "vite build && esno ./build/script/postBuild.ts && powershell -NoProfile -ExecutionP…