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

2024-04-23 02:20
文章标签 日志 查询 redis 监视器

本文主要是介绍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四个监视器,如图所示
在这里插入图片描述

这篇关于Redis中的慢查询日志和监视器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/927528

相关文章

使用SQL语言查询多个Excel表格的操作方法

《使用SQL语言查询多个Excel表格的操作方法》本文介绍了如何使用SQL语言查询多个Excel表格,通过将所有Excel表格放入一个.xlsx文件中,并使用pandas和pandasql库进行读取和... 目录如何用SQL语言查询多个Excel表格如何使用sql查询excel内容1. 简介2. 实现思路3

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制

Redis延迟队列的实现示例

《Redis延迟队列的实现示例》Redis延迟队列是一种使用Redis实现的消息队列,本文主要介绍了Redis延迟队列的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录一、什么是 Redis 延迟队列二、实现原理三、Java 代码示例四、注意事项五、使用 Redi

Redis缓存问题与缓存更新机制详解

《Redis缓存问题与缓存更新机制详解》本文主要介绍了缓存问题及其解决方案,包括缓存穿透、缓存击穿、缓存雪崩等问题的成因以及相应的预防和解决方法,同时,还详细探讨了缓存更新机制,包括不同情况下的缓存更... 目录一、缓存问题1.1 缓存穿透1.1.1 问题来源1.1.2 解决方案1.2 缓存击穿1.2.1

redis-cli命令行工具的使用小结

《redis-cli命令行工具的使用小结》redis-cli是Redis的命令行客户端,支持多种参数用于连接、操作和管理Redis数据库,本文给大家介绍redis-cli命令行工具的使用小结,感兴趣的... 目录基本连接参数基本连接方式连接远程服务器带密码连接操作与格式参数-r参数重复执行命令-i参数指定命

C++中实现调试日志输出

《C++中实现调试日志输出》在C++编程中,调试日志对于定位问题和优化代码至关重要,本文将介绍几种常用的调试日志输出方法,并教你如何在日志中添加时间戳,希望对大家有所帮助... 目录1. 使用 #ifdef _DEBUG 宏2. 加入时间戳:精确到毫秒3.Windows 和 MFC 中的调试日志方法MFC

SpringBoot如何使用TraceId日志链路追踪

《SpringBoot如何使用TraceId日志链路追踪》文章介绍了如何使用TraceId进行日志链路追踪,通过在日志中添加TraceId关键字,可以将同一次业务调用链上的日志串起来,本文通过实例代码... 目录项目场景:实现步骤1、pom.XML 依赖2、整合logback,打印日志,logback-sp

深入理解Redis大key的危害及解决方案

《深入理解Redis大key的危害及解决方案》本文主要介绍了深入理解Redis大key的危害及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、背景二、什么是大key三、大key评价标准四、大key 产生的原因与场景五、大key影响与危

Redis主从复制的原理分析

《Redis主从复制的原理分析》Redis主从复制通过将数据镜像到多个从节点,实现高可用性和扩展性,主从复制包括初次全量同步和增量同步两个阶段,为优化复制性能,可以采用AOF持久化、调整复制超时时间、... 目录Redis主从复制的原理主从复制概述配置主从复制数据同步过程复制一致性与延迟故障转移机制监控与维

Redis过期键删除策略解读

《Redis过期键删除策略解读》Redis通过惰性删除策略和定期删除策略来管理过期键,惰性删除策略在键被访问时检查是否过期并删除,节省CPU开销但可能导致过期键滞留,定期删除策略定期扫描并删除过期键,... 目录1.Redis使用两种不同的策略来删除过期键,分别是惰性删除策略和定期删除策略1.1惰性删除策略