Redis一个命令请求从发送到完成的步骤以及初始化服务器步骤

一个命令请求从发送到完成的步骤

如下:
1、客户端将命令请求发送给服务器

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

2、服务器读取命令请求,并分析出命令参数

  • 读取套接字中协议格式的命令请求,将其保存到客户端状态的输入缓冲区中
  • 对输入缓冲区中的命令请求进行解析,提取出命令参数以及命令参数的个数,保存到客户端状态的argv属性与argc属性
  • 调用命令执行器,执行指定指令

3、命令执行器根据参数查找命令的实现函数,然后执行实现函数并得到命令回复

  • 根据客户端状态的argv[0]参数,在命令表中查找参数所指定的命令,并将找到的命令保存到客户端状态的cmd属性里
  • 执行预备操作,确保命令可以正确执行(一些检查操作)
  • 将客户端状态指针作为参数传入实现函数,进行执行
  • 执行后续工作
    • 若开启了慢查询日志功能,模块会检查是否需要给刚刚执行完的命令添加一条慢查询日志
    • 若开启了AOF持久化,模块会将刚刚执行的命令请求写入到AOF缓冲区中
    • 如果有从服务器正在复制当前服务器,将刚刚执行的命令传播给所有从服务器

4、服务器将命令回复返回给客户端

  • 命令回复一开始保存在客户端状态的输出缓冲区里,并为客户端的套接字关联命令回复处理器
  • 当客户端套接字变为可写状态时,服务器会执行命令回复处理器,将保存在客户端输出缓冲区的命令回复发送给客户端
  • 命令回复发送完毕,回复处理器清空客户端状态的输出缓冲区
  • 客户端结收到协议格式的命令回复后,解析并打印

初始化服务器步骤

1、初始化服务器状态
创建struct redisServer类型的实例变量,server作为服务器的状态,并为结构中的各个属性设置默认值
例如:

设置服务器的运行ID
设置服务器的默认运行频率
设置服务器的默认配置文件路径
设置服务器的运行架构
设置服务器的默认端口号
设置服务器的默认RDB持久化条件和AOF持久化条件
初始化服务器的LRU时钟 创建命令表

2、载入服务器配置
3、初始化服务器数据结构
除了命令表之外,服务器状态还包含其他数据结构

  • server.clients链表,记录了所有与服务器相连的客户端的状态结构,链表的每个节点都包含了一个redisClient结构实例
  • server.db数组,数组中包含了服务器的所有数据库
  • server.pubsub_channels,用于保存频道订阅信息的字典
  • server.pubsub_patterns,用于保存模式订阅信息的链表
  • servber.lua,用于执行Lua脚本的Lua环境
  • server.slowlog,用于保存慢查询日志
    之后调用initServer函数,为数据结构分配内存,并且设置初始化值(通过配置文件的参数)
    当然该函数还进行了一些更加重要的操作:
  • 为服务器设置进程信号处理器
  • 创建共享对象,之后服务器将通过重用共享对象来避免反复创建相同的对象
  • 打开服务器的监听端口,并为监听套接字关联连接应答事件处理器,等待服务器正式运行时接收客户端的连接
  • 创建时间事件
  • 若AOF持久化功能开启,那么打开现有的AOF文件,若文件不存在,新建一个
  • 初始化服务器后台的I/O模块

4、还原数据库状态

  • 如果启用了AOF持久化功能,用AOF文件还原数据库状态
  • 否则,使用RDB文件还原

5、执行事件循环

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

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

相关文章

c打印行号和函数_使用C中的函数名称,行号从任何函数打印错误消息

c打印行号和函数Sometimes, it is necessary to print some message on logic failure or anytime with the function name and line number, so that program can be debugged and fixed the issue. 有时,有必要在逻辑故障时或在任何时候使用功能名称和行​​号打印…

Linux SPI框架

水平有限,描述不当之处还请指出,转载请注明出处http://blog.csdn.net/vanbreaker/article/details/7733476 Linux的SPI子系统采用主机驱动和外设驱动分离的思想,首先主机SPI控制器是一种平台设备,因此它以platform的方式注册进内…

dbms标识符无效_DBMS中的嵌套查询,相关的嵌套查询和集合比较运算符

dbms标识符无效嵌套查询 (Nested Queries) A query embedded in a query. This type of relation is termed as Nested Query and the Embedded Query is termed as a subquery. 查询中嵌入的查询。 这种类型的关系称为嵌套查询,而嵌入式查询称为子查询。 For exam…

重构——解决过长参数列表(long parameter list)

目录1、Replace Param with Query2、Preserve Whole Object3、Introduce Param Object4、Remove Flag Argument5、Combine Functions into ClassReference当我们需要在超长函数中提炼子函数时,如果函数内有大量的参数和临时变量,这将会对函数的提炼形成很…

C# 点点滴滴: out和ref

用c#很长一段时间了,不过基本是啥都不会,当C用的,作为写单片机的,还是真心觉得C比较亲切,呵呵。 不过总是要进步啊,慢慢积累呗,这次是写一个CAN的上位机模板出来,以后的项目就要彻底…

css控制图片最宽 最高值

.content img{width:expression_r(this.width > 500 && this.height < this.width ? 500:true);max-width:500px;height:expression_r(this.height >500 ? 500:true);max-height:500px; }转载于:https://www.cnblogs.com/panlin/archive/2013/01/06/2848017…

踩踩踩

http://china.findlaw.cn/laodongfa/ctjg/cy/cybc/ 二、合法裁员经济补偿标准的计算 按照《劳动合同法》第四十七条规定&#xff0c;经济补偿按劳动者在本单位工作的年限&#xff0c;每满一年支付一个月工资的标准向劳动者支付。六个月以上不满一年的&#xff0c;按一年计算;不…

c# 字节十六进制转十进制_用C中的十进制,八进制和十六进制数字初始化字节数组...

c# 字节十六进制转十进制C中的字节数组 (byte array in C) In C programming language, an unsigned char type can be used to declare byte array in C programming language. An unsigned char can contain a value from 0 to 255, which is the value of a byte. 在C编程语…

从uptime、stress、mpstat、pidstat观察CPU密集型、IO密集型、进程密集型切换的系统性能

uptime dyydyy-Lenovo-ThinkBook-14-IIL:~$ uptime10:27:10 up 7 min, 1 user, load average: 1.32, 0.99, 0.49结果分别对应&#xff1a;当前时间、系统运行时间、当前用户数目、过去 1 分钟、5 分钟、15 分钟的平均负载(Load Average) 平均负载是指单位时间内&#xff0c…

解析和创建xml

http://www.cnblogs.com/Li-Cheng/p/3610474.html 转载于:https://www.cnblogs.com/mxw272618/p/3769900.html

python - VirtualEnv virtualenvwrapper

VirtualEnv 是什么 VirtualEnv用于在一台机器上创建多个独立的python运行环境&#xff0c;VirtualEnvWrapper为前者提供了一些便利的命令行上的封装。 为什么要用 - 隔离项目之间的第三方包依赖&#xff0c;如A项目依赖django1.2.5&#xff0c;B项目依赖django1.3。- 为部署应用…

多台计算机共享内存_共享内存多处理器和指令执行| 计算机架构

多台计算机共享内存共享内存多处理器 (Shared Memory Multiprocessor) There are three types of shared memory multiprocessor: 共有三种类型的共享内存多处理器&#xff1a; UMA (Uniform Memory Access) UMA(统一内存访问) NUMA (Non- uniform Memory Access) NUMA(非统一…

htop与atop

htop htop使用详解–史上最强 atop Linux atop监控工具部署

js未看的文章

Web前端研发工程师编程能力飞升之路 在浏览器的背后&#xff08;一&#xff09; —— HTML语言的词法解析 组件化的前端开发流程 用js书写UI组件之js基础知识 GC与JS内存泄漏 蓝色理想之前端开发 w3c JavaScript Puzzlers react AngularJS入门教程 jQuery源码分析-如何做jQuery…

方法重写,隐藏在子类父类中的各种调用实践

一.子类和父类方法之间的关系 1.当子类和父类有方法完全相同的方法 namespace ConsoleApplication2 {class Program{static void Main(string[] args){B b new B();A a new A();A c new B();b.Show();a.Show();c.Show();Console.Read();}}public class A{public void Show()…

向量余弦值python_向量/矩阵的余弦值打印(元素明智的操作) 使用Python的线性代数

向量余弦值pythonPrerequisite: 先决条件&#xff1a; Defining a Vector 定义向量 Defining a Matrix 定义矩阵 Numpy is the library of function that helps to construct or manipulate matrices and vectors. The function numpy.cos(x) is a function used for generati…

centos 6.5网卡dhcp不能获得网关

环境:vmware centos6.5 添加两个虚拟网卡。一个自动获取ip(用于上网-桥接) 一个手动(与主机通信用于ssh-NAT)。 因为自已手动改了一下ifcfg-eth0里面的HWADDR地址。造成 eth0网卡不能识别。多出一个eth2的网卡。 配置eth2网卡&#xff0c;可以自动获取到ip地址 但用netstat -r…

CPU上下文切换(系统调用、进程上下文、线程上下文、中断上下文)

CPU寄存器&#xff0c;与程序计数器&#xff08;存储CPU正在执行的指令位置&#xff0c;或者即将执行的下一条指令的位置&#xff09;共同组成CPU上下文。 CPU上下文切换指的是&#xff1a;把前一个任务的CPU上下文保存起来&#xff0c;然后加载新任务的上下文到这些寄存器和程…

(解决)从同事那里取来的工程不能编译运行,出现以下错误,求帮助

错误 6 未能从程序集 C:\Program Files (x86)\MSBuild\Microsoft\Silverlight for Phone\v4.0\Microsoft.Phone.Build.Tasks.dll 加载任务“Microsoft.Phone.Build.Tasks.ValidateWMAppManifest”。 Could not load file or assembly Microsoft.Build.Utilities, Version2.0.0…

编程 小数位数_使用动态编程的n位数的非递减总数

编程 小数位数Problem statement: 问题陈述&#xff1a; Given the number of digits n, find the count of total non-decreasing numbers with n digits. 给定位数n &#xff0c;找到具有n位数字的非递减总数。 A number is non-decreasing if every digit (except the fir…