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、执行事件循环
Redis一个命令请求从发送到完成的步骤以及初始化服务器步骤相关推荐
- 如何发起一个HTTP请求,发送HTTP请求的几种方式
目录 概述 如何发起一个HTTP请求 模拟浏览器发送HTTP请求方式 概述 如何发起一个HTTP请求?这个问题似乎既简单又复杂,简单是指当你在浏览器里输入一个URL时,按回车键后这个HTTP请求就发起 ...
- php 请求 响应,PHP 取得服务器响应一个 HTTP 请求所发送的所有标头
用户评论: Backslider (2012-02-15 19:06:56) It should be noted that rather than returning "false&quo ...
- redis——命令请求的执行过程
发送命令请求 当用户在客户端中键入一个命令请求时, 客户端会将这个命令请求转换成协议格式, 然后通过连接到服务器的套接字, 将协议格式的命令请求发送给服务器. 读取命令请求 当客户端与服务器之间的连接 ...
- 一个http请求发送到后端的详细过程
我们来看当我们在浏览器输入http://www.mycompany.com:8080/mydir/index.html,幕后所发生的一切. 首先http是一个应用层的协议,在这个层的协议,只是一种通讯 ...
- 控制发送的请求条数_一个 HTTP 请求的曲折经历
关注"逆锋起笔"领取视频教程☞ 程序员进阶必备资源免费送「各种技术!」 ☜ 来源:www.neroht.com/article-detail/18从一个经典的面试题说起,输入URL ...
- 面试官:一个 TCP 连接可以发送多少个 HTTP 请求?问倒一大片。。。
点关注公众号,回复"1024"获取2TB学习资源! 曾经有这么一道经典面试题:从 URL 在浏览器被被输入到页面展现的过程中发生了什么? 相信大多数准备过的同学都能回答出来,但是如 ...
- 浏览器的一个请求从发送到返回都经历了什么?
浏览器输入url经历图 分析过程: 1.用户输入url,浏览器内部代码将url进行拆分解析 url解析图 2.浏览器首先去找本地的hosts文件,检查在该文件中是否有相应的域名.IP对应关系,如果有, ...
- php curl form-data,在php curl multipart / form-data请求中发送一个文件和json数据
我正在尝试在PHP的curl请求中上传文件和json数据 . 请求在命令行中使用curl正常工作 . 这是命令行中的curl请求: curl -v --basic -u'username' -F fi ...
- redis debug命令详解
redis debug命令提供了几个非常实用的debug功能,本文介绍下redis-2.8.19下的debug命令. debug segment 让redis发生段错误,如果开启了coredump,则 ...
最新文章
- oracle alert下的文件,Oracle 11g alert文件变化
- 你们要的圣诞帽~ Python实现
- Ubuntu通过路由器上网的配置
- 准时制 jit 减少库存
- P2178-[NOI2015]品酒大会【SA,并查集】
- 909计算机基础大纲,《计算机应用基础》(专科)考试大纲
- TCP/IP协议详解 卷一(阅读指导)
- java基础—Calendar类方法演示
- Web开发之三:前后端开发任务量分析与比较
- 怎么使用PVS stream Linux
- Redis 分布式客户端 Redisson 分布式锁快速入门
- Introduction to Computer Networking学习笔记(十七):Switching and Forwarding 交换与转发
- 微信小程序与普通网页区别
- 魔兽争霸III冰封王座宽屏分辨率的修改方法
- 解决 Maven ‘parent.relativePath‘ of POM
- 福禄克光纤测试:多模光纤 VS 单模光纤
- 一款商城APP开发需要多少钱?
- UEFI开发与调试---edk2中的Module
- 第三方互联网支付的主要类型
- .net程序config文件中特殊字符的正确写法
热门文章
- 大前端最强vscode教程(基础篇)
- java-JSON: Expected value at 1:0 错误
- 计算机硬件知识竞赛题库,电脑知识竞赛题库.pdf
- Autorize插件的使用方法
- exp导出excel oracle_如何从Oracle快速导出数据到Excel
- java虚拟机编译_[四] java虚拟机JVM编译器编译代码简介 字节码指令实例 代码到底编译成了什么形式...
- CSS基础语法(三) CSS的6种特性
- AngularJS(三):重复HTML元素、数据绑定
- C#中用WebClient.UploadData 方法上载文件数据
- mysql数据库sql语句优化