Redis服务器复制和多个客户端建立网络连接,处理客户端发送的命令请求,在数据库中保存客户端执行命令所产生的数据。

一,命令请求的执行过程

客户端向服务器发送命令请求 set key value

服务器接收并处理客户端发来的命令请求 set key value 。在数据库中进行设置操作,并产生命令回复 OK

服务器把命令回复 OK 发送给客户端

客户端接收服务器返回的命令回复 OK ,并把这个回复打印给用户看

1.发送命令请求

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

2.读取命令请求

当套接字因为客户端的写入变得可读时(读事件发生),服务器将调用命令请求处理器来执行以下操作:

读取套接字中协议格式的命令请求,并将其保存到客户端状态的输入缓冲区中。

对输入缓冲区中的命令请求进行分析,提取出命令参数,以及命令参数的个数,然后分别保存到客户端状态的argv和argc属性中

调用命令执行器,执行客户端指定的命令

2.1各种命令执行器的工作

2.1.1,命令执行器:查找命令实现

命令执行器第一步:根据客户端状态的argv[0]参数,在命令表中查找参数所指定的命令,并且把找到的命令保存到客户端状态的cmd属性中

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

typedef struct redisCommend{

  name;//命令名字

  proc;函数指针,指向命令的实现函数。

  arity;//命令参数的个数,检查命令请求的格式是否正确

  sflags;//命令属性,比如这个命令是写命令还是读命令

}

比如:set命令,实现函数是 setCommend。命令的参数个数为3,表示接受三个或以上的参数,命令的标识为"wm",表示set命令是一个写入命令,并且在执行这个命令前,服务器要对占用内存状况进行检查,因为这个命令可能会占用大量内存。

2.1.2,执行预备操作

现在,命令实现函数,参数,参数个数都收集齐了,但是在真正执行命令之前,还需要预备操作:

检查客户端状态的cmd指针是否指向NULL

根据cmd属性指向的redisCommend结构的arity属性,检查命令请求所给定的参数格式是否正确。如果 arity属性为 -3,那么用户输入的命令参数个数必须大于等于三个

检查客户端是否已经通过了身份验证,没有通过验证的客户端只能执行AUTH命令,执行其他命令,服务器会向客户端返回一个错误。

如果服务器打开了maxmemory功能,在执行命令前,还要先检查服务器的内存占用情况,在有需要时进行内存回收

2.1.3,调用命令的实现函数

当服务器需要执行命令时,只需要执行以下语句:

client ----> cmd ---->proc(client)。等于执行语句:setCommend(client);

被调用的命令实现函数执行指定的操作,并产生相应的命令回复,这些回复会被保存在客户端状态的输出缓冲区中(buf属性和reply属性),之后实现函数还会为客户端的套接字关联命令回复处理器,这个处理器负责将命令回复返回给客户端。

2.1.4,执行后续工作

根据刚刚执行命令所耗费的时长,更新被执行命令的RedisCommand结构的milliseconds属性,并将命令的redisCommand结构的calls计数器的值加1

如果开启了慢查询日志功能,慢查询日志模块会检查是否需要为刚刚执行完的命令请求添加到慢查询日志中

3,把命令回复发送给客户端

命令实现函数会把命令回复保存到客户端的输出缓冲区中,并为客户端的套接字关联命令回复处理器,当套接字变为可写状态时,服务器就会执行命令回复处理器,将保存在客户端输出缓冲区中的命令回复发送给客户端。

当命令回复发送完毕后,回复处理器会清空客户端状态的输出缓冲区

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

当客户端接收到协议格式的命令回复后,把这些回复转换成人可读的格式

二,serverCron函数

Redis服务器中的serverCron函数默认每隔100ms执行一次,这个函数负责管理服务器的资源,并保持服务器自身的良好运转。

第二部分之Redis服务器(第十四章)的更多相关文章

  1. Gradle 1.12用户指南翻译——第二十四章. Groovy 插件

    其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://g ...

  2. 第十四章——循环神经网络(Recurrent Neural Networks)(第二部分)

    本章共两部分,这是第二部分: 第十四章--循环神经网络(Recurrent Neural Networks)(第一部分) 第十四章--循环神经网络(Recurrent Neural Networks) ...

  3. “全栈2019”Java多线程第二十四章:等待唤醒机制详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...

  4. “全栈2019”Java第二十四章:流程控制语句中决策语句switch下篇

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  5. JavaScript高级程序设计:第十四章

    第十四章 一.表单的基础知识 在HTML中,表单是由<form>元素来表示的,而在javascript中,表单对应的则是HTMLFormElement类型.HTMLFormElement继 ...

  6. CentOS7安装CDH 第十四章:CDH的优化

    相关文章链接 CentOS7安装CDH 第一章:CentOS7系统安装 CentOS7安装CDH 第二章:CentOS7各个软件安装和启动 CentOS7安装CDH 第三章:CDH中的问题和解决方法 ...

  7. 【odoo14】第十四章、CMS网站开发

    第十四章.CMS网站开发** Odoo有一个功能齐全的内容管理系统(CMS).通过拖放功能,你的最终用户可以在几分钟内设计一个页面,但是在Odoo CMS中开发一个新功能或构建块就不是那么简单了.在本 ...

  8. 《Linux命令行与shell脚本编程大全》 第十四章 学习笔记

    第十四章:呈现数据 理解输入与输出 标准文件描述符 文件描述符 缩写 描述 0 STDIN 标准输入 1 STDOUT 标准输出 2 STDERR 标准错误 1.STDIN 代表标准输入.对于终端界面 ...

  9. C#语言和SQL Server第十三 十四章笔记

    十三章  使用ADO.NET访问数据库 十四章使用ADO.NET查询和操作数据库 十三章:                                                       ...

随机推荐

  1. pip安装python库时使用国内镜像资源加速下载过程

    pip默认安装包是从网站https://pypi.org/simple下载,我们可以将其改成国内的镜像网站,加速下载过程,下面以安装numpy库为例: pip install -i https://p ...

  2. 《深入理解Java虚拟机》-----第6章 类文件结构——Java高级开发必须懂的

    代码编译的结果从本地机器码转变为字节码,是存储格式发展的一小步,却是编程语言发展的一大步. 6.1 概述 记得在第一节计算机程序课上我的老师就讲过:“计算机只认识0和1,所以我们写的程序需要经编译器翻 ...

  3. okhttputils【 Android 一个改善的okHttp封装库】使用(三)

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 这一篇主要讲一下将OkHttpUtils运用到mvp模式中. 数据请求地址:http://www.wanandroid.com/to ...

  4. Egg.js 中入参的校验

    日常作业中免不了频繁处理 GET/POST 的入参,你当然可以每个 action 中都重复地去做这些事情, 从 query 或 body 取出入参, 对可选的入参进行判空, 处理入参的类型转换, 对入 ...

  5. Python:鲜为人知的功能特性(下)

    GitHub 上有一个名为<What the f*ck Python!>的项目,这个有趣的项目意在收集 Python 中那些难以理解和反人类直觉的例子以及鲜为人知的功能特性,并尝试讨论这些 ...

  6. 浅析关于java的一些基础问题(上篇)

    要想让一个问题变难,最基本有两种方式,即极度细化和高度抽象.对于任何语言的研究,良好的基础至关重要,本篇文章,将从极度细化的角度 来解析一些java中的基础问题,这些问题也是大部分编程人员的软肋或易混 ...

  7. Python数据采集——提取页面内容的几种手段

    前言 在我们获取了网页的信息后,往往需要对原始信息进行提取,得到我们想要的数据.对信息的提取方式主要有以下几种:正则表达式.XPath.BeautifulSoup.本篇博客主要总结这三种方式的基本语法 ...

  8. Spring异常分析

    异常报错 2019-01-14 10:40:18.427 ERROR 11776 --- [ost-startStop-1] o.s.b.w.e.t.TomcatStarter : Error sta ...

  9. entity framework 实现按照距离排序

    在做项目时,经常会遇到“离我最近”这种需求.顾名思义,它需要根据用户的经纬度和事物的经纬度计算距离,然后进行排序,最后分页(当然这些操作要在数据库中进行,否则就变成假分页了). 我们通常可以用sql语 ...

  10. IntelliJ IDEA下如何设置JSP模板

    今天在学习Spring MVC知识时,发现自己所用的IntelliJ IDEA中自动生成的JSP文件不支持EL表达式的使用,所以就想导入新的JSP模板,方便以后使用.根据旧模板的提示,如下图 找到Se ...