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. springboot + redis(单机版)

    本次和大家分享的是在springboot集成使用redis,这里使用的是redis的jedis客户端(这里我docker运行的redis,可以参考 docker快速搭建几个常用的第三方服务),如下添加 ...

  2. 用Python教你微信防撤回(文本、图片、语音、视频、名片等...)

    大家在使用微信过程中,有时候消息还没看到,就被撤回了.毕竟好奇心大家都有,明知到消息被撤回了,就更想去看一下是什么内容心里想着万一是女神给我表白了呢.. 今天就用Python来做个微信防撤回的小功能. ...

  3. 在vue项目中添加全局提示框

    1.写一个提示框组件:msg.vue (注明:这里用两个div的原因是成功和失败的提示不能用同一个div,因为他们可能紧接着出现,所以不能从始至终只有一个提示框在工作) 2.写一个调用此组建的js : ...

  4. 【面试】我是如何在面试别人Spring事务时“套路”对方的

    “中国最好面试官” 自从上次写了一篇“[面试]我是如何面试别人List相关知识的,深度有点长文”的文章后,有读者专门加我微信,说我是“中国最好面试官”,这个我可受不起呀. 我只是希望把面试当作是一次交 ...

  5. Spring Boot配置拦截器及实现跨域访问

    拦截器功能强大,能够深入方法前后,常应用于日志记录.权限检查和性能检测等,几乎是项目中不可或缺的一部分,本文就来实现Spring Boot自定义拦截器的配置. 理论指导 问:Spring Boot怎么 ...

  6. Flutter 即学即用系列博客——10 混淆

    前言 之前的博客我们都是在 debug 的模式下进行开发的. 实际发布到市场或者给到用户的都是 release 包. 而对于 Android 来说,release 包一个重要的步骤就是混淆. Andr ...

  7. [转]How to: Create a Report Server Database (Reporting Services Configuration)

    本文转自:https://docs.microsoft.com/en-us/previous-versions/sql/sql-server-2008-r2/ms157300%28v%3dsql.10 ...

  8. SpringMVC+Mybatis 如何配置多个数据源并切换?

    最近公司一个项目需要连接两个数据库(A和B)操作,有的模块查询A库,有的模块查询B库,因此需要改造下,项目后台用的是SpringMVC+Mybatis+MySQL架构,折腾了两天后终于搞定了,在这里记 ...

  9. shiro缓存管理

    一. 概述 Shiro作为一个开源的权限框架,其组件化的设计思想使得开发者可以根据具体业务场景灵活地实现权限管理方案,权限粒度的控制非常方便.首先,我们来看看Shiro框架的架构图:从上图我们可以很清 ...

  10. springMVC实现增删改查

    首先需要准备好一张数据库表我这里用emp这张表:具体代码: /* SQLyog 企业版 - MySQL GUI v8.14 MySQL - 5.1.73-community ************* ...