redis--服务器与客户端
- 初始化服务器全局状态。
- 载入配置文件。
- 创建 daemon 进程。
- 初始化服务器功能模块。
- 载入数据。
- 开始事件循环
- 服务器中的所有数据库。
- 命令表:
- 在执行命令时,根据字符来查找相应命令的实现函数。
- 事件状态。
- 服务器的网络连接信息:
- 套接字地址
- 端口,以及套接字描述符。
- 所有已连接客户端的信息。
- Lua脚本的运行环境及相关选项。
- 实现订阅与发布(pub/sub)功能所需的数据结构。
- 日志(log)和慢查询日志(slowlog)的选项和相关信息。
- 数据持久化(AOF和RDB)的配置和状态。
- 服务器配置选项:
- 比如要创建多少个数据库,
- 是否将服务器进程作为daemon进程来运行,
- 最大连接多少个客户端,
- 压缩结构(zip structure)的实体数量,等等。
- 统计信息:比如键有多少次命令、不命中,服务器的运行时间,内存占用,等等。
- 用户可能想使用 AOF 持久化,而不是默认的 RDB 持久化。
- 用户可能想用其他端口来运行Redis,以避免端口冲突。
- 用户可能不想使用默认的16个数据库,而是分配更多或更少数量的数据库。
- 用户可能想对默认的内存限制措施和回收策略做调整。
- 为server变量的数据结构子属性分配内存。
- 为数据结构分配内存,并初始化这些数据结构,等同于对相应的功能进行初始化
- 比如说,当为订阅与发布所需的链表分配内存之后,订阅与发布功能就处于就绪状态,随时可以为 Redis 所用了。
- 初始化这些数据结构。
- 初始化 Redis 进程的信号功能。
- 初始化日志功能。
- 初始化客户端功能。
- 初始化共享对象。
- 初始化事件功能。
- 初始化数据库。
- 初始化网络连接。
- 初始化订阅与发布功能。
- 初始化各个统计变量。
- 关联服务器常规操作(cron job)到时间事件,关联客户端应答处理器到文件事件。
- 如果AOF功能已打开,那么打开或创建AOF文件。
- 设置内存限制。
- 初始化Lua脚本环境。
- 初始化慢查询功能。
- 初始化后台操作线程。
.png)
- 服务器通过文件事件无阻塞地 accept 客户端连接,并返回一个套接字描述符 fd 。
- 服务器为 fd 创建一个对应的 redis.h/redisClient 结构实例,并将该实例加入到服务器的已连接客户端的链表中。
- 服务器在事件处理器为该 fd 关联读文件事件。
- 套接字描述符。
- 客户端正在使用的数据库指针和数据库号码。
- 客户端的查询缓存( query buffer)和回复缓存( reply buffer)。
- 一个指向命令函数的指针,以及字符串形式的命令、命令参数和命令个数,这些属性会在命令执行时使用。
- 客户端状态:
- 记录了客户端是否处于
- SLAVE
- MONITOR
- 或者事务状态。
- 实现事务功能(比如 MULTI 和 WATCH)所需的数据结构。
- 实现阻塞功能(比如 BLPOP 和 BRPOPLPUSH)所需的数据结构。
- 实现订阅与发布功能(比如PUBLISH和SUBSCRIBE)所需的数据结构。
- 统计数据和选项:客户端创建的时间,客户端和服务器最后交互的时间,缓存的大小,等等。
- 客户端通过套接字向服务器传送命令协议数据。
- 服务器通过读事件来处理传入数据,并将数据保存在客户端对应 redisClient 结构的查询缓存中。
- 根据客户端查询缓存中的内容,程序从命令表中查找相应命令的实现函数。
- 程序执行命令的实现函数,修改服务器的全局状态 server 变量,并将命令的执行结果保存到客户端 redisClient 结构的回复缓存中,然后为该客户端的 fd 关联写事件。
- 当客户端 fd 的写事件就绪时,将回复缓存中的命令结果传回给客户端。至此,命令执行完毕。
- 客户端调用写入函数,将协议内容 写入连接到服务器的套接字中。
- 协议内容:*3\r\n$3\r\nSET\r\n$4\r\nYEAR\r\n$4\r\n2013\r\n"
- 当S的文件事件处理器执行时, 它会察觉到 C1 所对应的读事件已经就绪,于是它将协议文本读入,并保存在查询缓存。
- 通过对查询缓存进行分析( parse)
- 服务器在命令表中查找 SET 字符串所对应的命令实现函数,最终定位到 t_string.c/setCommand 函数,
- 另外,两个命令参数 YEAR 和 2013 也会以字符串的形式保存在客户端结构中。
- 接着,程序将客户端、要执行的命令、命令参数等送入命令执行器:
- 执行器调用 setCommand函数,将数据库中 YEAR 键的值修改为 2013
- 然后将命令的执行结果保存在客户端的回复缓存中
- 并为客户端 fd 关联写事件,用于将结果回写给客户端
- 因为 YEAR 键的修改,其他和数据库命名空间相关程序
- 比如 AOF 、 REPLICATION 还有事务安全性检查(是否修改了被 WATCH 监视的键?)也会被触发
- 当这些后续程序也执行完毕之后,命令执行器退出,服务器其他程序(比如时间事件处理器)继续运行。
- 当 C1 对应的写事件就绪时,程序就会将保存在客户端结构回复缓存中的数据回写给客户端
- 当客户端接收到数据之后,它就将结果打印出来,显示给用户看
• 服务器经过初始化之后,才能开始接受命令。
• 服务器初始化可以分为六个步骤:
状态信息。
• 客户端向服务器发送命令,服务器接受命令然后将命令传给命令执行器,执行器执行给
redis--服务器与客户端的更多相关文章
- Redis服务器和客户端的通信
Redis客户端使用RESP(Redis序列化协议)与Redis服务器进行通信,RESP在位于TCP之上,而网络模型上客户端和服务器是保持的双工的连接.如图1 而一个简单的请求/响应的串行通信模型如下 ...
- [转]redis服务器与客户端保活参数(tcp-keepalive)设置
最近使用redis的list做跨进程的消息队列,客户端使用的是redis-cplusplus-client.这个client库还是蛮好用的,提供了和redis命令行一致的接口,很方便. 使用过程中发现 ...
- Redis源码解析:14Redis服务器与客户端间的交互
Redis服务器是典型的一对多服务器程序,通过使用由IO多路复用技术实现的文件事件处理器,Redis服务器使用单线程单进程的方式来处理命令请求,并与多个客户端进行网络通信. Redis客户端与服务器之 ...
- C#中使用Redis学习一 windows安装redis服务器端和客户端
学习背景 今天是2015年1月2日,新年刚开始的第二天,先祝大家元旦快乐啦(迟到的祝福吧^_^).前段时间一直写Jquery插件开发系列博文,这个系列文章暂停一段时间,最近一直在看redis,我将把r ...
- Python/dotNET Redis服务连接客户端调用SET方法的同时获取Redis服务器返回的内容
在用Python或dotNET redis客户端连接redis服务器的时候,当你调用客户端的SET方法后同时还想得到其返回的字符串,那么需要处理一下. 1. Redis Python redis客户端 ...
- C#客户端Redis服务器的分布式缓存
介绍 在这篇文章中,我想介绍我知道的一种最紧凑的安装和配置Redis服务器的方式.另外,我想简短地概述一下在.NET / C#客户端下Redis hash(哈希类型)和list(链表)的使用. 在这篇 ...
- [ 搭建Redis本地服务器实践系列三 ] :图解Redis客户端工具连接Redis服务器
上一章 [ 搭建Redis本地服务器实践系列二 ] :图解CentOS7配置Redis 介绍了Redis的初始化脚本文件及启动配置文件,并图解如何以服务的形式来启动.终止Redis服务,可以说我们的 ...
- Redis服务器搭建/配置/及Jedis客户端的使用方法
摘要 Redis服务器搭建.常用参数含意说明.主从配置.以及使用Jedis客户端来操作Redis Redis服务器搭建 安装 在命令行执行下面的命令: $ wget http://download.r ...
- redis集群与分片(1)-redis服务器集群、客户端分片
下面是来自知乎大神的一段说明,个人觉得非常清晰,就收藏了. 为什么集群? 通常,为了提高网站响应速度,总是把热点数据保存在内存中而不是直接从后端数据库中读取.Redis是一个很好的Cache工具.大型 ...
- Redis02 Redis客户端之Java、连接远程Redis服务器失败
1 查看支持Java的redis客户端 本博文采用 Jedis 作为redis客户端,采用 commons-pool2 作为连接redis服务器的连接池 2 下载相关依赖与实战 2.1 到 Repos ...
随机推荐
- IOS开发---菜鸟学习之路--(十六)-将Image转换为Base64
我们直接在.m文件的引用头文件部分 和 @interface AddPictureViewController () 之间 加入 增加部分的代码 然后就可以使用图片转Base64了 #impor ...
- 程序集链接器(AL.exe)
AL.exe使用程序可以生成一个EXE文件或者DLL PE文件(其中只包含对其他模块中的类型进行描述的一个清单). 不要在普通的命令行窗口中编译,请先打开C:\ProgramData\Microsof ...
- 最简单的RSA及其几个网站和工具
最简单的形式 给你公钥和一个密文. flag.enc就是密文,我们用记事本是看不出什么的,其实也不用看,因为后边的解密是直接用脚本读取文件的,只需要知道这是密文. pub.pem就是公钥,用记事本打开 ...
- Python学习-day16-DOM
文档对象模型(Document Object Model,DOM)是一种用于HTML和XML文档的编程接口.它给文档提供了一种结构化的表示方法,可以改变文档的内容和呈现方式.我们最为关心的是,DOM把 ...
- C# 调试之 Debug.WriteLine()、Trace.WriteLine()
Trace 类 和 Debug 类的区别在于,Trace 类会同时在 Debug.Release 模式下起作用,而 Debug 只作用在 Debug 模式下. 区别: 1. 输出跟踪信息 Trace. ...
- Leetcode 583.两个字符串的删除操作
两个字符串的删除操作 给定两个单词 word1 和 word2,找到使得 word1 和 word2 相同所需的最小步数,每步可以删除任意一个字符串中的一个字符. 示例 1: 输入: "se ...
- HDU 4177 模拟时间问题
Avoiding a disaster Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- linux系统mysql密码修改脚本
编写了一个适用于阿里云linux系统 mysql密码修改脚本,使用阿里云提供的一键安装包配置后,如果account.log文件删除,并且忘记mysql密码时,可以通过脚本来重置mysql密码. 附:一 ...
- linux系统初始化——inittab文件解析
inittab文件解析 inittab配置文件每行的基本格式如下. id:runlevels:action:process 其中某些部分可以为空,下面我们逐一介绍. 1.id 1-2个字符,配置行的唯 ...
- zabbix3.4 源码部署
centos6.8 系统 zabbix3.4.9 msyql5.7.22 php5.6.24 在centos6上面源码部署zabbix.3.4 问题比较多,需要花不少时间去解决,建议 ...