Redis中的慢查询日志(一)

慢查询日志

概述

Redis的慢查询日志功能用于记录执行时间超过给定时长的命令请求,用户可以通过这个功能产生的日志来
监视和优化查询速度。服务器配置有两个和慢查询日志相关的选项:

  • 1.slowlog-log-slower-than选项指定执行时间超过多少微妙(1秒=1000 000微妙)的命令请求会被记录到日志上
  • 2.slowlog-max-len选项指定服务器最多保存多少条慢查询日志。

例子

  • 举个例子。如果slow-log-slower-than选项的值为100,那么执行时间超过100微妙的命令就会被记录到慢查询日志,如果这个选项的值为500,那么执行的时间超过500微妙的命令就会被记录到慢查询日志
  • 举个例子。如果服务器slowlog-max-len的值为100,并且假设服务器已经储存了100条慢查询日志,那么如果服务器打算添加一条新日志的话,它就必须先删除目前保存的最旧的那条日志,然后再添加新日志
  • 举个例子。首先用COFIG SET将slowlog-log-slower-than选项的值设为0微妙,这样Redis服务器执行的任何命令都会被记录到慢查询日志中,接着讲slowlog-max-len选项的值设为5,让服务器最多保存5条慢查询日志:
127.0.0.1:6379> CONFIG SET slowlog-log-slower-than 0
OK
127.0.0.1:6379> CONFIG SET slowlog-max-len 5
OK

接着,用客户端发送几条命令请求:

127.0.0.1:6379> SET msg "hello world"
OK
127.0.0.1:6379> SET number 10086
OK
127.0.0.1:6379> SET database "Redis"
OK

然后使用SLOWLOG GET命令查看服务器所保存的慢查询日志:

如果这是再执行一条SLOWLOG GET命令,那么将看到,上一次执行的SLOWLOG GET命令已经被记录到了慢查询日志中,而最旧的、ID为0的慢查询日志已经被删除,服务器的慢查询日志数量仍然为5条

1) 1) (integer) 6
   2) (integer) 1713670934
   3) (integer) 5
   4) 1) "SET"
      2) "database"
      3) "Redis"
2) 1) (integer) 5
   2) (integer) 1713670927
   3) (integer) 6
   4) 1) "SET"
      2) "number"
      3) "10086"
3) 1) (integer) 4
   2) (integer) 1713670923
   3) (integer) 10
   4) 1) "SET"
      2) "msg"
      3) "hello world"
4) 1) (integer) 3
   2) (integer) 1713670868
   3) (integer) 6
   4) 1) "CONFIG"
      2) "SET"
      3) "slowlog-max-len"
      4) "5"
5) 1) (integer) 2
   2) (integer) 1713670860
   3) (integer) 7
   4) 1) "CONFIG"
      2) "SET"
      3) "slowlog-log-slower-than"
      4) "0"
1) 1) (integer) 7
   2) (integer) 1713670977
   3) (integer) 2095
   4) 1) "SLOWLOG"
      2) "GET"
2) 1) (integer) 6
   2) (integer) 1713670934
   3) (integer) 5
   4) 1) "SET"
      2) "database"
      3) "Redis"
3) 1) (integer) 5
   2) (integer) 1713670927
   3) (integer) 6
   4) 1) "SET"
      2) "number"
      3) "10086"
4) 1) (integer) 4
   2) (integer) 1713670923
   3) (integer) 10
   4) 1) "SET"
      2) "msg"
      3) "hello world"
5) 1) (integer) 3
   2) (integer) 1713670868
   3) (integer) 6
   4) 1) "CONFIG"
      2) "SET"
      3) "slowlog-max-len"
      4) "5"

慢查询记录的保存

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

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;

// ...
}

slowlog_entry_id属性的初始值为0,每当创建一条新的慢查询日志时,这个属性的值就会用作新日志的ID值,之后程序会对这个属性的值增一。例如,在创建第一条慢查询日志时,slowlog_entry_id的值0会称为第一条慢查询日志的id,而之后服务器会对这个属性的值增一;当服务器再创建新的慢查询日志的时候,slowlog_entry_id的值1就会成为第二条慢查询日志的ID,然后服务器再次对这个属性的值增一,以此类推。slowlog链表保存了服务器中的所有慢查询日志,链表中的每个节点都保存了一个
slowlogEntry结构,每个slowlogEntry结构代表一条慢查询日志:

typedef struct slowlogEntry {
// 唯一标识符
long long id;

// 命令执行时的时间,格式为UNIX时间戳
time_t time;

// 执行命令消耗的时间,以微妙为单位
long long duration;

// 命令与命令参数
robj **argv;

// 命令与命令参数的数量
int argc;
} slowlogEntry;

例子

  • 举个例子。对于以下慢查询日志来说:
2) 1) (integer) 5
   2) (integer) 1713670927
   3) (integer) 6
   4) 1) "SET"
      2) "number"
      3) "10086"

在这里插入图片描述
在这里插入图片描述

  • 如图展示了服务器状态中和慢查询日志功能有关的属性:
    1.slowlog_entry_id为7,表示服务器下条慢查询日志的id将为7
    2.slowlog链表包含了id为6至2的慢查询日志,最新的6号日志排在链表的表头,而最旧的2号日志排在链表的表尾,这表明slowlog链表是使用插入到表头的方式来添加新日志的。
    3.slowlog_log_slower_than记录了服务器配置slowlog-log-slower-than选项的值0,表示任何执行的时间超过0微妙的命令都会被慢查询日志记录
    4.slowlog-max-属性记录了服务器配置slowlog-max-len选项的值为5,表示服务器最多储存5条慢查询日志

慢查询日志的阅览和删除

SLOWLOG GET命令的伪代码实现:

def SLOWLOG_GET(number=None):
# 用户没有给定number参数
# 那么打印服务器包含的全部慢查询日志
if number is None;
number = SLOWLOG_LEN()

# 遍历服务器中的慢查询日志
for log in redisServer.slowlog:
if number <= 0:
# 打印的日志数量已经足够,跳出循环
break
else:
# 继续打印,将计数器的值减一
number -= 1
# 打印日志
printLog(log)

查看日志数量的SLOWLOG LEN命令可以用以下伪代码来定义

def SLOWLOG_LEN():
# slowlog链表的长度就是慢查询的条目数量
retuern len(redisServer.slowlog)

另外用于清除所有慢查询日志的SLOWLOG RESET命令可以用以下伪代码来定义

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ZeRO论文阅读

一.前情提要 1.本文理论为主&#xff0c;并且仅为个人理解&#xff0c;能力一般&#xff0c;不喜勿喷 2.本文理论知识较为成体系 3.如有需要&#xff0c;以下是原文&#xff0c;更为完备 Zero 论文精读【论文精读】_哔哩哔哩_bilibili 二.正文 1.前言 ①为什么用该技术&…

ctf.show_web14

在switch中&#xff0c;case 里如果没有 break&#xff0c;则会继续向下执行 case。 过滤了information_schema.tables、information_schema.column、空格 information_schema.tables 或 .columns 用反引号 information_schema.tables 同时查3个字段 ?query-1/**/union/**/…

【Python- 包,自定义模块,import】

Python- 包&#xff0c;自定义模块&#xff0c;import ■ 包■ 包创建■ 导入包&#xff0c;模块&#xff0c;函数方法■ __init__.py■ __all__ [my_module1] ■ 自定义模块■ 新建模块■ 导入自定义模块使用■ 导入不同模块的同名功能■ __all__变量 ■ import■ import 模块…

Java 网络编程之TCP(二):基于BIO的聊天室

在上一篇【Java 网络编程之TCP(一)&#xff1a;基于BIO】中&#xff0c;介绍Java中I/O和TCP的基本概念&#xff0c;本文在上文的基础上&#xff0c;实现一个基本的聊天室的功能。 聊天室需求描述&#xff1a; 聊天客户端&#xff1a;发送消息给所有其他客户端&#xff0c;接收…

《剑指 Offer》专项突破版 - 面试题 113、114 和 115 : 详解拓扑排序(C++ 实现)

目录 前言 面试题 113 : 课程顺序 面试题 114 : 外星文字典 面试题 115 : 重建序列 前言 拓扑排序是指对一个有向无环图的节点进行排序之后得到的序列。如果存在一条从节点 A 指向节点 B 的边&#xff0c;那么在拓扑排序的序列中节点 A 出现在节点 B 的前面。一个有向无环…

关于某次授权的大型内网渗透测试(1)

前期渗透&#xff1a; 打点&#xff1a;&#xff08;任意文件上传&#xff09; 直接发现头像处任意文件上传&#xff0c;这里直接上传冰蝎即可。 tasklist查看杀软 System Idle Process 0 N/A System …

细说postgresql之pg_rman备份恢复 —— 筑梦之路

pg_rman是一款开源的备份恢复软件&#xff0c;支持在线和基于PITR的备份恢复方式。 pg_rman类似于oracle的rman&#xff0c;可以进行全量、增量、归档日志的备份。 运行模式&#xff1a; 安装部署 Releases ossc-db/pg_rman GitHub 1、需要根据PG Server的版本&#xff0c;下…

05 MySQL--字段约束、事务、视图

1. CONSTRAINT 约束 创建表时&#xff0c;可以给表的字段添加约束&#xff0c;可以保证数据的完整性、有效性。比如大家上网注册用户时常见的&#xff1a;用户名不能为空。对不起&#xff0c;用户名已存在。等提示信息。 约束包括&#xff1a; 非空约束&#xff1a;not null检…

6.6 完数(project) educoder项目实训

前言 在最近的Python课上&#xff0c;做到这样一个“有趣”的作业&#xff0c;求得前n个完数&#xff0c;并输出其与其真约数的约数的加和式子&#xff0c;刚开始没怎么在意这个题&#xff0c;想着不就是做过好几遍了的语言基础练习题嘛&#xff0c;但是接下来的几小时没想到都…

探索设计模式的魅力:开启智慧之旅,AI与机器学习驱动的微服务设计模式探索

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 ✨欢迎加入探索AI与机器学习驱动的微服务设计模式之旅✨ 亲爱的科技爱好者们&#xff0c;有没…

【独家推荐】视频下载神器:一键解决Mac/Win视频下载转换难题!

在信息爆炸的时代&#xff0c;视频已经成为我们获取知识和娱乐的重要途径。然而&#xff0c;很多精彩视频并没有提供直接的下载链接&#xff0c;这就给广大视频爱好者带来了不小的困扰。不过&#xff0c;现在有了这款专为Mac和Windows用户打造的视频下载转换器&#xff0c;一切…

Redux入门:使用@reduxjs/toolkit构建React应用程序状态管理

随着应用程序复杂性的增加,有效管理应用程序状态变得越来越重要。Redux是一种流行的状态管理解决方案,随着应用程序复杂性的增加,有效管理应用程序状态变得越来越重要。Redux是一种流行的状态管理解决方案,但传统的Redux设置和使用过程比较繁琐。幸运的是,Redux官方团队推出了r…

C语言实现贪吃蛇项目(2)

先来看看效果&#xff1a; 20240420_212115 文章目录&#xff1a; 3.项目实现3.0宽字符的打印3.01本地化操作setlocale函数宽字符的打印 3.1贪吃蛇结构的创建和维护3.11贪吃蛇结构的创建3.12贪吃蛇的维护 3.2初始化游戏3.21.打印欢迎界面、隐藏光标和设置窗口大小3.22.绘制地图…

记录好用的python包

记录好用的python包 PipxCentos 安装pipx确保 Pip 被安装更新 Pip安装 Pipx添加 Pipx 到 PATH临时添加到 PATH:永久添加到 PATH: 验证 Pipx 安装 Hatch安装特性 Poetry安装准备工作创建虚拟环境激活虚拟环境安装包追踪 & 更新包常用配置pycharm 远程连接poetry创建的虚拟环…

pycharm创建的项目

pycharm生成django templates删出 settings.py

数据分析_商品维度占比及变化可视化分析(Pandas和Matplotlib)

数据分析_商品维度占比及变化可视化分析(Pandas和Matplotlib) 分析维度包括: 各商品年度销量占比 各商品月度销量变化 构建测试数据 这里你可以了解到: 如何生成时间相关的数据。 如何从列表&#xff08;可迭代对象&#xff09;中生成随机数据。 Pandas 的 DataFrame 自…

IOS 32位调试环境搭建

一、背景 调试IOS程序经常使用gdb&#xff0c;目前gdb只支持32位程序调试&#xff0c;暂不支持IOS 64位程序调试。IOS 32位程序使用GDB调试之前&#xff0c;必须确保手机已越狱&#xff0c;否则无法安装和使用GDB调试软件。下面详细介绍GDB调试IOS 32位程序的环境搭建。 二、I…

数字时代的智慧演奏

数字化时代&#xff0c;工业不再是孤独的机器运转&#xff0c;而是演绎着一场智能与数据的华丽交响。无数智能节点的联动&#xff0c;数据的涌动&#xff0c;成为工业的新活力&#xff0c;同时也是创新的源泉。 工业互联网将每个机器、设备连接在一起&#xff0c;打破了原本独立…

从预训练损失的角度,理解语言模型的涌现能力

原文&#xff1a;Understanding Emergent Abilities of Language Models from the Loss Perspective 摘要 本文从预训练损失的角度重新审视语言模型的涌现能力&#xff0c;挑战了以往以模型大小或训练计算量为标准的观念。通过实验&#xff0c;作者发现预训练损失是预测下游任…

SRIO系列-时钟逻辑与复位逻辑

一、前言 上一篇讲述了SRIO协议的基本概念&#xff0c;传输的HELLO帧格式、事务类型等&#xff0c;本篇说一下SRIO IP核的时钟关系。 基本的IP设置可以参考此篇文章&#xff1a;【高速接口-RapidIO】Xilinx SRIO IP 核详解-CSDN博客 二、时钟关系 PHY可以在两个时钟域上运行…