第二部分之Redis服务器(第十四章)
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服务器(第十四章)的更多相关文章
- Gradle 1.12用户指南翻译——第二十四章. Groovy 插件
其他章节的翻译请参见: http://blog.csdn.net/column/details/gradle-translation.html 翻译项目请关注Github上的地址: https://g ...
- 第十四章——循环神经网络(Recurrent Neural Networks)(第二部分)
本章共两部分,这是第二部分: 第十四章--循环神经网络(Recurrent Neural Networks)(第一部分) 第十四章--循环神经网络(Recurrent Neural Networks) ...
- “全栈2019”Java多线程第二十四章:等待唤醒机制详解
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...
- “全栈2019”Java第二十四章:流程控制语句中决策语句switch下篇
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- JavaScript高级程序设计:第十四章
第十四章 一.表单的基础知识 在HTML中,表单是由<form>元素来表示的,而在javascript中,表单对应的则是HTMLFormElement类型.HTMLFormElement继 ...
- CentOS7安装CDH 第十四章:CDH的优化
相关文章链接 CentOS7安装CDH 第一章:CentOS7系统安装 CentOS7安装CDH 第二章:CentOS7各个软件安装和启动 CentOS7安装CDH 第三章:CDH中的问题和解决方法 ...
- 【odoo14】第十四章、CMS网站开发
第十四章.CMS网站开发** Odoo有一个功能齐全的内容管理系统(CMS).通过拖放功能,你的最终用户可以在几分钟内设计一个页面,但是在Odoo CMS中开发一个新功能或构建块就不是那么简单了.在本 ...
- 《Linux命令行与shell脚本编程大全》 第十四章 学习笔记
第十四章:呈现数据 理解输入与输出 标准文件描述符 文件描述符 缩写 描述 0 STDIN 标准输入 1 STDOUT 标准输出 2 STDERR 标准错误 1.STDIN 代表标准输入.对于终端界面 ...
- C#语言和SQL Server第十三 十四章笔记
十三章 使用ADO.NET访问数据库 十四章使用ADO.NET查询和操作数据库 十三章: ...
随机推荐
- ToolbarDemo【Toolbar作为顶部导航栏的简单使用】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 简单记录ToolBar作为导航栏的使用.关键点在于如何在dialogfragment中使用toolbar! Toolbar的图标.标 ...
- 聊聊在AOP模式下的缓存方案
面向方法的数据集缓存 使用了autofac做为ioc容器,使用Autofac.Extras.DynamicProxy2作为方法拦截器,缓存面向方法,直接在方法上添加CachingAttribute特性 ...
- JVM上的响应式流 — Reactor简介
强烈建议先阅读下JVM平台上的响应式流(Reactive Streams)规范,如果没读过的话. 官方文档:https://projectreactor.io/. 响应式编程 作为响应式编程方向上的第 ...
- WebServeice 动态代理类
1, webservice是什么? 是一个平台独立的,低耦合的,自包含的.基于可编程的web的应用程序,可使用开放的XML(标准通用标记语言下的一个子集)标准来描述.发布.发现.协调和配置这些应用程序 ...
- 创建索引CreateIndex
nuget引用NEST new一个客户端 源码可查ElasticClient.cs new一个ElasticClient有多种方式 第一种 ES地址是http://localhost:9200,可以直 ...
- tomcat 控制台中文乱码问题
1.找到${CATALINA_HOME}/conf/logging.properties2.添加语句:java.util.logging.ConsoleHandler.encoding = GBK 3 ...
- 了解spring
一.spring简介 Spring是一个JavaEE轻量级的一站式的开发框架(spring的可插拔特性,企业用于整合其他框架)轻量级:使用最少的代码启动程序,根据所需选择功能选择模块使用一站式:提供了 ...
- mybatis bug之org.apache.ibatis.exceptions.PersistenceException:
详细报错信息: org.apache.ibatis.exceptions.PersistenceException: ### Error querying database. Cause: java. ...
- unity transform 常用操作
1.寻找物体 1.1 寻找满足条件的子物体 ` public static Transform FindObj(Transform transform, Func<Transform, bool ...
- JavaScript实现获取两个排序数组的中位数算法示例
本文实例讲述了JavaScript排序代码实现获取两个排序数组的中位数算法.分享给大家供大家参考,具体如下: 题目 给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 . 请找出这两个 ...