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

如下:
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一个命令请求从发送到完成的步骤以及初始化服务器步骤相关推荐

  1. 如何发起一个HTTP请求,发送HTTP请求的几种方式

    目录 概述 如何发起一个HTTP请求 模拟浏览器发送HTTP请求方式 概述 如何发起一个HTTP请求?这个问题似乎既简单又复杂,简单是指当你在浏览器里输入一个URL时,按回车键后这个HTTP请求就发起 ...

  2. php 请求 响应,PHP 取得服务器响应一个 HTTP 请求所发送的所有标头

    用户评论: Backslider (2012-02-15 19:06:56) It should be noted that rather than returning "false&quo ...

  3. redis——命令请求的执行过程

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

  4. 一个http请求发送到后端的详细过程

    我们来看当我们在浏览器输入http://www.mycompany.com:8080/mydir/index.html,幕后所发生的一切. 首先http是一个应用层的协议,在这个层的协议,只是一种通讯 ...

  5. 控制发送的请求条数_一个 HTTP 请求的曲折经历

    关注"逆锋起笔"领取视频教程☞ 程序员进阶必备资源免费送「各种技术!」 ☜ 来源:www.neroht.com/article-detail/18从一个经典的面试题说起,输入URL ...

  6. 面试官:一个 TCP 连接可以发送多少个 HTTP 请求?问倒一大片。。。

    点关注公众号,回复"1024"获取2TB学习资源! 曾经有这么一道经典面试题:从 URL 在浏览器被被输入到页面展现的过程中发生了什么? 相信大多数准备过的同学都能回答出来,但是如 ...

  7. 浏览器的一个请求从发送到返回都经历了什么?

    浏览器输入url经历图 分析过程: 1.用户输入url,浏览器内部代码将url进行拆分解析 url解析图 2.浏览器首先去找本地的hosts文件,检查在该文件中是否有相应的域名.IP对应关系,如果有, ...

  8. php curl form-data,在php curl multipart / form-data请求中发送一个文件和json数据

    我正在尝试在PHP的curl请求中上传文件和json数据 . 请求在命令行中使用curl正常工作 . 这是命令行中的curl请求: curl -v --basic -u'username' -F fi ...

  9. redis debug命令详解

    redis debug命令提供了几个非常实用的debug功能,本文介绍下redis-2.8.19下的debug命令. debug segment 让redis发生段错误,如果开启了coredump,则 ...

最新文章

  1. oracle alert下的文件,Oracle 11g alert文件变化
  2. 你们要的圣诞帽~ Python实现
  3. Ubuntu通过路由器上网的配置
  4. 准时制 jit 减少库存
  5. P2178-[NOI2015]品酒大会【SA,并查集】
  6. 909计算机基础大纲,《计算机应用基础》(专科)考试大纲
  7. TCP/IP协议详解 卷一(阅读指导)
  8. java基础—Calendar类方法演示
  9. Web开发之三:前后端开发任务量分析与比较
  10. 怎么使用PVS stream Linux
  11. Redis 分布式客户端 Redisson 分布式锁快速入门
  12. Introduction to Computer Networking学习笔记(十七):Switching and Forwarding 交换与转发
  13. 微信小程序与普通网页区别
  14. 魔兽争霸III冰封王座宽屏分辨率的修改方法
  15. 解决 Maven ‘parent.relativePath‘ of POM
  16. 福禄克光纤测试:多模光纤 VS 单模光纤
  17. 一款商城APP开发需要多少钱?
  18. UEFI开发与调试---edk2中的Module
  19. 第三方互联网支付的主要类型
  20. .net程序config文件中特殊字符的正确写法

热门文章

  1. 大前端最强vscode教程(基础篇)
  2. java-JSON: Expected value at 1:0 错误
  3. 计算机硬件知识竞赛题库,电脑知识竞赛题库.pdf
  4. Autorize插件的使用方法
  5. exp导出excel oracle_如何从Oracle快速导出数据到Excel
  6. java虚拟机编译_[四] java虚拟机JVM编译器编译代码简介 字节码指令实例 代码到底编译成了什么形式...
  7. CSS基础语法(三) CSS的6种特性
  8. AngularJS(三):重复HTML元素、数据绑定
  9. C#中用WebClient.UploadData 方法上载文件数据
  10. mysql数据库sql语句优化