第二部分之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查询和操作数据库 十三章: ...
随机推荐
- 从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 十六 ║Vue基础:ES6初体验 & 模块化编程
缘起 昨天说到了<从壹开始前后端分离 [ Vue2.0+.NET Core2.1] 十五 ║ Vue前篇:JS对象&字面量&this>,通过总体来看,好像大家对这一块不是很 ...
- js数组去重常用方法
js数组去重是面试中经常会碰到的问题,无论是前端还是node.js数组常见的有两种形式,一种是数组各元素均为基本数据类型,常见的为数组字符串格式,形如['a','b','c'];一种是数组各元素不定, ...
- Spring之旅第五篇-AOP详解
一.什么是AOP? Aspect oritention programming(面向切面编程),AOP是一种思想,高度概括的话是“横向重复,纵向抽取”,如何理解呢?举个例子:访问页面时需要权限认证,如 ...
- java~lambda表达式让查询更优雅
在java之前的版本里,如果希望从集合时查找符合条件的数据,如果先遍历他,这种写法是我们不能接受的,所以现在java有了lambda就很好的解决了这个问题,让代码更优雅一些! /** * lambda ...
- springboot~rabbitmq的队列初始化和绑定
配置文件,在rabbit中自动建立exchange,queue和绑定它们的关系 代码里初始化exchange 代码里初始化queue 代码里绑定exchange,queue和routekey 配置文件 ...
- 页面优化,谈谈重绘(repaint)和回流(reflow)
一.前言 偶尔在面试过程中遇到过重汇与回流reflow的问题,毕竟页面优化也是考核一个开发者能力的关键之一,上篇文章聊了下documentfragment也是为了减轻回流问题,那么本篇文章好好介绍下重 ...
- windows如何安装memcached
官网上并未提供 Memcached 的 Windows 平台安装包,我们可以使用以下链接来下载,你需要根据自己的系统平台及需要的版本号点击对应的链接下载即可: 32位系统 1.2.5版本:http:/ ...
- ArcPy 拷贝数据库
使用Python脚本进行图形数据库的拷贝. 原始帖子地址:https://www.2cto.com/database/201302/187391.html 整理Python代码: # -*- codi ...
- 路由刷rom手册
最近对家里面那5,6个路由器下手了. 路由列表:小米mini 2台. 优酷路由宝l1,tp wdr3320,tp wr840n, 友华wr1200js,小米路由r1n 步骤: 1. 想办法开启ssh ...
- 关于ORACLE数据库名以及数据实例名等几个重要概念
在Oracle中有关数据库和数据库实例的几个重要概念,有时候如果理解不是很深或者对其疏忽.混淆了,还真容易搞错或弄不清其概念,下面就数据库实例名.数据库名.数据库域名.数据库服务名.全局数据库名几个概 ...