当前位置: 首页 > news >正文

Redis设计与实现第14章 -- 服务器 总结(命令执行器 serverCron函数 初始化)

14.1 命令请求的执行过程

一个命令请求从发送到获得回复的过程中,客户端和服务器都需要完成一系列操作。

14.1.1 发送命令请求

当用户在客户端中输入一个命令请求的时候,客户端会把这个命令请求转换为协议格式,然后通过连接到服务器的套接字,将协议格式的命令请求发送给服务器。

14.1.2 读取命令请求

当客户端与服务器之间的连接套接字因为客户端的写入而变得可读时,服务器将调用命令请求处理器来执行以下操作:
  • 读取套接字中协议格式的命令请求,并将其保存到客户端状态的输入缓冲区里面
  • 对输入缓冲区中的命令请求进行分析,提取出命令请求中包含的命令参数和个数,分别保存到argv/argc属性里面。
  • 调用命令执行器,执行客户端指定的命令

14.1.3 命令执行器1:查找命令实现

根据客户端状态的argv[0]参数,在命令表里查找参数所指定的命令,并将找到的命令保存到客户端状态的cmd属性里。

命令表是一个字典,字典的键是一个个命令名字,字典的值是一个个redisCommend结构。

主要属性有:name 名字、proc 函数指针、arity 命令参数的个数、sflags 字符串形式的标识值、flags 二进制标识、calls 服务器总共执行了多少次这个命令、millseconds 服务器执行这个命令耗费的总时长

sflags属性可以使用的标识值如下:

  • w:写入命令
  • r:只读命令
  • m:可能占用大量内存,内存紧张的话禁用
  • a:管理命令
  • p:发布订阅功能的命令
  • s:不可以在lua脚本执行
  • R:随机命令
  • S:排序
  • l:可以在服务器载入数据的过程中使用
  • t:允许从服务器在带有过期数据时使用的命令
  • M:监视器模式下不会自动被传播

14.1.4 命令执行器2:执行预备操作

+ 检查客户端状态的cmd指针是否指向NULL + 根据客户端cmd属性指向的redisCommand结构的arity属性,检查命令请求所给定的参数个数是否正确。 + 检查客户端是否通过了身份认证 + 如果服务器打开了maxmemory功能,执行命令前先检查服务器的内存占用情况,并在有需要时进行内存回收 + 如果服务器上一次执行BGSAVE命令时出错,并且服务器打开了stop-writes-on-bgsave-error功能,而且即将要执行的是写命令,那么服务器将拒绝执行 + 客户端正在用SUBSCRIBE命令订阅频道,或是正在用PSUBSCRIBE命令订阅模式,服务端只会执行客户端发来的SUBSCRIBE PSUBSCRIBE UNSUBSCRIBE PUNSUBSCRIBE 四个命令,其他命令都会被服务器拒绝 + 如果服务器正在进行数据载入,客户端发送的命令必须要带有l标识才会被执行 + 如果服务器因为执行Lua脚本而超时并进入阻塞状态,服务器只会执行客户端发来的SHUTDOWN nosave和SCRIPT KILL命令 + 如果客户端正在执行事务,只会执行EXEC DISCARD MULTI WATCH 四个命令 + 如果服务器打开了监视器功能,将要执行的命令和参数等信息发送给监视器

14.1.5 命令执行器3:调用命令实现函数

被调用的命令实现函数会执行指定的操作,并产生相应的命令回复,这些回复会被保存在客户端状态的输出缓冲区里,buf属性和reply属性。

14.1.6 命令执行器4:执行后续工作

+ 如果服务器开启了慢查询日志功能,会检查是否需要为刚刚执行完的命令请求添加一条新的慢查询日志 + 根据刚刚执行命令所耗费的时长,更新被执行命令的redisCommand结构的millseconds属性,并将命令的redisCommand结构的calls计数器的值加一 + 如果服务器开启了AOF持久化功能,会将刚刚执行的命令请求写入AOF缓冲区里 + 如果有其他从服务器正在复制当前这个服务器,那么服务器会将刚刚执行的命令传播给所有从服务器

14.1.7 将命令回复发送给客户端

命令实现函数将命令回复保存到客户端的输出缓冲区里面,并为客户端的套接字关联命令回复处理器。

当客户端套接字变成可写状态的时候,服务器就会执行命令回复处理器,将保存在客户端输出缓冲区的命令回复发送给客户端

14.1.8 客户端接收并打印命令回复

客户端收到协议格式的命令回复后,会转化为人类可读的格式。

14.2 serverCron函数

每隔100ms执行一次

14.2.1 更新服务器时间缓存

Redis服务器中有不少功能需要获取系统的当前时间,而每次获取系统的当前时间都需要执行一次系统调用,为了减少系统调用的执行次数,服务器状态中的unixtime属性和mstime属性被用作当前时间的缓存

这两个属性是100ms更新一次的,所以精确度不高

  • 当打印日志、更新服务器的LRU时钟、决定是否执行持久化任务、计算服务器上线时间这种对时间精确度要求不高的功能上才会用
  • 对于为键设置过期时间、添加慢查询日志这种需要高精度时间的功能来说,服务器还是会再次执行系统调用

14.2.2 更新LRU时钟

服务器的lruclock属性保存了服务器的LRU时钟,每个redis对象都会有一个lru属性,保存了对象最后一次被命令访问的时间。当服务器计算数据库键的空转时间的时候,会用服务器的lruclock属性记录的时间减去对象lru属性记录的时间。

serverCron函数默认以10秒一次的频率更新lruclock属性的值

14.2.3 更新服务器每秒执行命令次数

trackOperationsPerSecond函数以每100ms一次的频率执行,功能是以抽样计算的方式,估算并记录服务器在最后一秒钟处理的命令请求数量。

可以通过INFO status命令的instantaneous_ops_per_sec域查看

14.2.4 更新服务器内存峰值记录

服务器状态的stat_peak_memory属性记录了服务器的内存峰值大小

每次serverCron函数执行时,服务器都会查看当前使用的内存数量

14.2.5 处理SIGTERM信号

在启动服务器时,Redis会为服务器进程的SIGTERM信号关联处理器sigtermHandler函数,这个信号处理器负责在服务器接到SIGTERM信号时,打开服务器状态的shutdown_asap 标识

每次serverCron函数运行时,程序都会对shutdown_asap 属性进行检查,并根据属性的值决定是否关闭服务器。值为1表示关闭服务器。

服务器在关闭自身前会进行RDB持久化操作,这也就是服务器拦截SIGTERM信号的原因

14.2.6 管理客户端资源

调用clientsCron函数,对一定数量的客户端进行检查:
  • 连接超时,很久没互动
  • 上一次执行请求命令后,输入缓冲区的大小超过了一定长度,程序会释放客户端当前的输入缓冲区,重新创建一个默认大小的输入缓冲区

14.2.7 管理数据库资源

databasesCron函数,对服务器中的一部分数据库进行检查,1删除过期键,收缩字典等,详情见第9章

14.2.8 执行被延迟的BGREWRITEAOF

在服务器执行BGSAVE命令的期间,如果客户端向服务器发来BGREWRITEAOF命令那么服务器会将 BGREWRITEAOF命令的执行时间延迟到 BGSAVE命令执行完毕之后。服务器的aof_rewrite_scheduled标识记录了服务器是否延迟了BGREWRITEAOF命令

每次serverCron函数执行时,函数都会检查BGSAVE命令或者BGREWRITEAOF命令是否正在执行,如果这两个命令都没在执行,并且aof_rewrite_scheduled属性的值为1,那么服务器就会执行之前被推延的BGREWRITEAOF命令。

14.2.9 检查持久化操作的运行状态

服务器状态使用 rdb_child_pid属性和aof_child_pid属性记录执行 BGSAVE 命令和BGREWRITEAOF命令的子进程的ID,这两个属性也可以用于检查BGSAVE命令或者BGREWRITEAOF命令是否正在执行

每次serverCron函数执行时,程序都会检查这两个属性的值,只要其中一个属性的值不为-1,程序就会执行一次wait3函数,检查子进程是否有信号发给服务器进程

  • 如果有信号到达,那么表示新的RDB文件已经生成完成或是AOF文件已经重写完毕,服务器进行后续的替换操作
  • 如果没有信号,不做动作

如果两个属性的值都是-1,说明没有进行持久化操作,检查:

  • 查看是否有BGREWRITEAOF被延迟了
  • 检查服务器的自动保存条件是否已经被满足,如果条件满足,而且服务器没有在执行其他持久化操作,那么服务器开始一次新的BGSAVE操作
  • 检查服务器设置的AOF重写条件是否满足,如果满足并且没有进行其他持久化操作,服务器开始一次新的BHREWRITEAOF操作

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

14.2.10 将AOF缓冲区文件的内容写入AOF文件

详情见11章

14.2.11 关闭异步客户端

输出缓冲区大小超出限制的客户端,详情见13章

14.2.12 增加cronloops计数器的值

cronloops属性记录了serverCron函数执行的次数,目前唯一的作用就是在复制模块中实现:每执行serverCron函数N次就执行一次指定代码的功能

14.3 初始化服务器

14.3.1 初始化服务器状态结构

创建一个redisServer类型的实例变量server作用服务器的状态,并为结构里的各个属性设置默认值,初始化函数为initServerConfig函数完成,主要工作为:设置服务器的运行ID、默认运行频率、默认配置文件路径、运行架构、默认端口号、默认RDB/AOF持久化条件、LRU时钟、创建命令表

14.3.2 载入配置选项

载入用户给定的配置参数和配置文件,并根据用户设定的配置,对server变量相关属性的值进行修改

14.3.3 初始化服务器数据结构

initServerConfig函数初始化server状态时,只创建了命令表一个数据结构,还有其他数据结构,比如:
  • server.clients链表,记录了和服务端相连的客户端的状态结构
  • server.db数组,包含了服务器的所有数据库
  • 保存频道订阅信息的pubsub_channels字典 保存模式订阅信息的pubsub_patterns链表
  • 执行lua脚本的lua环境
  • 用户保存慢查询日志的slowlog属性

这些都是在initServer函数里执行的,该函数负责初始化数据结构和设置操作,比如

  • 设置进行信号处理器
  • 设置共享对象,比如OK回复的字符串对象
  • 打开服务器的监听端口,并为监听套接字关联连接应答事件处理器,等待服务器正式运行时接受客户端的连接
  • 为serverCron函数创建时间事件,等待服务器正式运行时执行serverCron函数
  • 如果AOF持久化功能打开,创建/打开AOF文件
  • 初始化后台IO模块,bio

14.3.4 还原数据库状态

完成对服务器状态server变量的初始化之后,服务器需要载入RDB文件或AOF文件并根据文件记录的内容来还原服务器的数据库状态。
  • 如果开启了AOF持久化功能,用AOF文件还原
  • 否则,用RDB文件还原

14.3.5 执行事件循环

相关文章:

Redis设计与实现第14章 -- 服务器 总结(命令执行器 serverCron函数 初始化)

14.1 命令请求的执行过程 一个命令请求从发送到获得回复的过程中,客户端和服务器都需要完成一系列操作。 14.1.1 发送命令请求 当用户在客户端中输入一个命令请求的时候,客户端会把这个命令请求转换为协议格式,然后通过连接到服务器的套接字…...

多输入多输出 | Matlab实现TCN-GRU时间卷积神经网络结合门控循环单元多输入多输出预测

多输入多输出 | Matlab实现TCN-GRU时间卷积神经网络结合门控循环单元多输入多输出预测 目录 多输入多输出 | Matlab实现TCN-GRU时间卷积神经网络结合门控循环单元多输入多输出预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 多输入多输出 | Matlab实现TCN-GRU时间卷积…...

windows安全中心,永久卸载工具分享

使用方法 2024Goby红队版工具分享,附2024年漏洞POC下载 下载链接: https://pan.quark.cn/s/4fc2712a2afc一路回车,选项Y即可 耐心等待几秒种,自动重启 此时打开windows安全中心,已经完全不能使用了,响应…...

《安富莱嵌入式周报》第346期:开源2GHz带宽,12bit分辨率,3.2Gsps采样率示波,开源固件安全分析器, 开源口袋电源,开源健康测量,FreeCAD

周报汇总地址:嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 视频: https://www.bilibili.com/video/BV1TYBhYKECK/ 《安富莱嵌入式周报》第346期:开源2GHz带…...

Apache OFBiz xmlrpc XXE漏洞(CVE-2018-8033)

目录 1、漏洞描述 2、EXP下载地址 3、EXP利用 1、漏洞描述 Apache OFBiz是一套企业资源计划(ERP)系统。它提供了广泛的功能,包括销售、采购、库存、财务、CRM等。 Apache OFBiz还具有灵活的架构和可扩展性,允许用户根据业务需求…...

【论文复现】融入模糊规则的宽度神经网络结构

📝个人主页🌹:Eternity._ 🌹🌹期待您的关注 🌹🌹 ❀ 融入模糊规则的宽度神经网络结构 论文概述创新点及贡献 算法流程讲解核心代码复现main.py文件FBLS.py文件 使用方法测试结果示例&#xff1a…...

sql server 获取当前日期的时间戳

SQL Server 获取当前日期的时间戳 在 SQL Server 中,可以使用 GETDATE() 函数获取当前日期和时间。如果想要获取当前日期的时间戳,可以将日期转换为 UNIX 时间戳格式。本文将介绍如何在 SQL Server 中获取当前日期的时间戳,并提供示例代码。 …...

LLM PPT Translator

LLM PPT Translator 引言Github 地址UI PreviewTranslated Result Samples 引言 周末开发了1个PowerPoint文档翻译工具,上传PowerPoint文档,指定想翻译的目标语言,通过LLM的能力将文档翻译成目标语言的文档。 Github 地址 https://github.…...

铲屎官进,2024年宠物空气净化器十大排行,看看哪款吸毛最佳?

不知道最近换毛季,铲屎官们还承受的住吗?我家猫咪每天都在表演“天女散花”,家里没有一块干净的地方,空气中也都是堆积的浮毛,幸好有宠物空气净化器这种清理好物。宠物空气净化器针对宠物浮毛设计,可以有效…...

python 中常用的定积分求解方法

【例1】 解:本例题使用 Scipy 科学计算库的 quad 函数,它的一般形式是 scipy.integrate.quad(f,a,b),其中 f 是积分的函数名称,a和b分别是下线和上线。 【代码如下】: import numpy as np from scipy.integrate impo…...

音视频相关的一些基本概念

音视频相关的一些基本概念 文章目录 音视频相关的一些基本概念RTTH264profile & levelI帧 vs IDRMP4 封装格式AAC封装格式TS封装格式Reference RTT TCP中的RTT指的是“往返时延”(Round-Trip Time),即从发送方发送数据开始,到…...

pikachu文件上传漏洞通关详解

声明:文章只是起演示作用,所有涉及的网站和内容,仅供大家学习交流,如有任何违法行为,均和本人无关,切勿触碰法律底线 目录 概念:什么是文件上传漏洞一、客户端check二、MIME type三、getimagesi…...

【拥抱AI】向量数据库有哪些常见的检索算法?

在信息检索领域,有许多常见的算法用于帮助用户从大量数据中找到相关的信息。以下是一些常见的检索算法: 布尔模型示例(文本操作) 在文本操作中,布尔模型可以通过编写一个简单的脚本来实现。例如,你可以创…...

Webpack前端工程化进阶系列(二) —— HMR热模块更新(图文+代码)

前言 之前更新过一篇Webpack文章:Webpack入门只看这一篇就够了(图文代码),没想到颇受好评,很快就阅读量就破万了hhh,应读者私信的要求,决定继续更新Webpack进阶系列的文章! 进入今天的主题 —— HMR 热模块替换(HotM…...

【RAG 项目实战 07】替换 ConversationalRetrievalChain(单轮问答)

【RAG 项目实战 07】替换 ConversationalRetrievalChain(单轮问答) NLP Github 项目: NLP 项目实践:fasterai/nlp-project-practice 介绍:该仓库围绕着 NLP 任务模型的设计、训练、优化、部署和应用,分享大…...

godot游戏引擎_瓦片集和瓦片地图介绍

在 Godot 中,TileSet 和 TileMap 是用于处理瓦片地图的两个关键概念,它们的作用和用途有明显的区别。以下是两者的详细对比: 1. TileSet(瓦片集) TileSet 是资源,定义瓦片的内容和属性。 特点&#xff1a…...

7、深入剖析PyTorch nn.Module源码

文章目录 1. 重要类2. add_modules3. Apply(fn)4. register_buffer5. nn.Parametersister_parameters6. 后续测试 1. 重要类 nn.module --> 所有神经网络的父类,自定义神经网络需要继承此类,并且自定义__init__,forward函数即可: #!/usr…...

如何提升编程能力第二篇

如何提升编程能力2 1. 引言2. 掌握理论基础2.1 理解编程语言的核心2.2 数据结构与算法2.3 计算机基础与系统设计3.1 多写代码3.2 参与开源项目3.3 开发自己的项目 4. 提高代码质量4.1 代码风格与可读性4.2 测试驱动开发 1. 引言 编程是推动现代科技发展的核心技能,…...

问:SpringBoot核心配置文件都有啥,怎么配?

在SpringBoot的开发过程中,核心配置文件扮演着至关重要的角色。这些文件用于配置应用程序的各种属性和环境设置,使得开发者能够灵活地定制和管理应用程序的行为。本文将探讨SpringBoot的核心配置文件,包括它们的作用、区别,并通过…...

RHCSA作业

课后练习 将整个 /etc 目录下的文件全部打包并用 gzip 压缩成/back/etcback.tar.gz [rootlocalhost ~]# tar -czvf /back/etcback.tar.gz -C / etc 使当前用户永久生效的命令别名:写一个命令命为hello,实现的功能为每输入一次hello命令,就有hello&#…...

ESP32学习笔记_FreeRTOS(3)——SoftwareTimer

摘要(From AI): 这篇笔记全面介绍了 FreeRTOS 软件定时器的核心概念和使用方法,包括定时器的创建、管理、常用 API 和辅助函数,并通过示例代码演示了如何启动、重置和更改定时器的周期。它强调了软件定时器的灵活性、平台无关性以及与硬件定时器的对比 …...

文心一言与千帆大模型平台的区别:探索百度AI生态的双子星

随着人工智能技术的迅猛发展,越来越多的公司开始投入资源开发自己的AI解决方案。在中国,百度作为互联网巨头之一,不仅在搜索引擎领域占据重要位置,还在AI领域取得了显著成就。其中,“文心一言”和“千帆大模型平台”便…...

【c语言】文件操作详解 - 从打开到关闭

文章目录 1. 为什么使用文件?2. 什么是文件?3. 如何标识文件?4. 二进制文件和文本文件?5. 文件的打开和关闭5.1 流和标准流5.1.1 流5.1.2 标准流 5.2 文件指针5.3 文件的打开和关闭 6. 文件的读写顺序6.1 顺序读写函数6.2 对比一组…...

Flink Sink的使用

经过一系列Transformation转换操作后,最后一定要调用Sink操作,才会形成一个完整的DataFlow拓扑。只有调用了Sink操作,才会产生最终的计算结果,这些数据可以写入到的文件、输出到指定的网络端口、消息中间件、外部的文件系统或者是…...

pcl::PointCloud<PointType>::Ptr extractedCloud; 尖括号里的值表示什么含义?

在C中&#xff0c;pcl::PointCloud<PointType>::Ptr是一种智能指针&#xff0c;它是Point Cloud Library (PCL)中用于管理pcl::PointCloud对象的智能指针类型。这里的<pcl::PointCloud<PointType>::Ptr>尖括号里的值表示智能指针所指向的对象类型。 让我们分…...

《基于FPGA的便携式PWM方波信号发生器》论文分析(三)——数码管稳定显示与系统调试

一、论文概述 基于FPGA的便携式PWM方波信号发生器是一篇由任青颖、庹忠曜、黄洵桢、李智禺和张贤宇 等人发表的一篇期刊论文。该论文主要研究了一种新型的信号发生器&#xff0c;旨在解决传统PWM信号发生器在移动设备信号调控中存在的精准度低和便携性差的问题 。其基于现场可编…...

VsCode 插件推荐(个人常用)

VsCode 插件推荐&#xff08;个人常用&#xff09;...

路由策略与路由控制实验

AR1、AR2、AR3在互联接口、Loopback0接口上激活OSPF。AR3、AR4属于IS-IS Area 49.0001&#xff0c;这两者都是Level-1路由器&#xff0c;AR3、AR4的系统ID采用0000.0000.000x格式&#xff0c;其中x为设备编号 AR1上存在三个业务网段A、B、C&#xff08;分别用Loopback1、2、3接…...

训练的decoder模型文本长度不一致,一般设置为多大合适,需要覆盖最长的文本长度么

在训练解码器模型时,文本长度不一致是常见的情况,需要根据任务的特性和数据集的长度分布来设置合理的最大长度 (max_length)。以下是一些指导原则,帮助你设置合适的最大长度: 1. 是否需要覆盖最长文本长度 覆盖最长文本长度: 如果任务对完整性要求很高(例如生成数学公式、…...

过滤条件包含 OR 谓词,如何进行查询优化——OceanBase SQL 优化实践

这篇博客涉及两个点&#xff0c;一个是 “OR Expansion 改写”&#xff0c;另一个是 “基于代价的改写”。 背景 在写SQL查询时&#xff0c;难以避免在过滤条件中使用 OR 谓词&#xff0c;但其往往会导致索引利用效率下降的问题 。本文将分享如何通过查询改写的2种方式进行优化…...

王也高清壁纸图片/成都百度推广账户优化

之前用飞线用旧板子飞线连接了一个wifi模块到usb0口上&#xff0c;调试ok的&#xff0c;现在新设计的板子回来了&#xff0c;wifi模块是连接在usb2口上的&#xff0c;系统起来后发现wlan0不存在&#xff0c;用lsusb查看wifi模块的usb设备竟然没有识别到。 [ 5.580165] insmo…...

网站设计培训哪里好/山东服务好的seo公司

大家好&#xff0c;我在洛谷办了一场比赛&#xff0c;欢迎来参加。题目并不难&#xff0c;基本上都是红题&#xff0c;20分钟就写完了&#xff01; 欢迎来报名参加嗷&#xff01; [NOIP1999 普及组] 导弹拦截 题目描述 某国为了防御敌国的导弹袭击&#xff0c;发展出一种导弹…...

佛山营销网站建设公司/交换链接的例子

不少使用Windows XP的用户&#xff0c;在IE8浏览器中打开网页&#xff0c;发现特别卡&#xff0c;关闭了浏览器&#xff0c;还是很卡&#xff0c;其实&#xff0c;这是IE8的一个新“特性”&#xff0c;IE8设计了一个备份iexplore.exe的进程&#xff0c;浏览的选项卡崩溃不会导致…...

微信二维码生成器在线制作/关键词排名优化品牌

响应 在接收到响应Unirest以对象的形式返回结果时&#xff0c;对于响应细节&#xff0c;该对象应该始终具有与每种语言相同的键。.getStatus&#xff08;&#xff09; - HTTP响应状态代码&#xff08;示例&#xff1a;200&#xff09; .getStatusText&#xff08;&#xff09; …...

长沙做网站建设公司排名/网站seo推广平台

假如你要处理一个数据集, 数据集中的每条记录都是一个dd维列向量. 但是这个dd太大了, 所以你希望把数据维度给降下来, 既可以去除一些冗余信息, 又可以降低处理数据时消耗的计算资源(用computation budget 来描述可能更形象). 用稍微正式点的语言描述: 已知:一个数据集DD, 记录…...

企业建设网站的作用/百度建一个网站多少钱

Nginx 标签 &#xff1a; nginx 代理 代理服务可简单的分为正向代理和反向代理: 正向代理: 用于代理内部网络对Internet的连接请求(如VPN/NAT),客户端指定代理服务器,并将本来要直接发送给目标Web服务器的HTTP请求先发送到代理服务器上, 然后由代理服务器去访问Web服务器, 并将…...