redis--服务器与客户端
- 初始化服务器全局状态。
- 载入配置文件。
- 创建 daemon 进程。
- 初始化服务器功能模块。
- 载入数据。
- 开始事件循环
- 服务器中的所有数据库。
- 命令表:
- 在执行命令时,根据字符来查找相应命令的实现函数。
- 事件状态。
- 服务器的网络连接信息:
- 套接字地址
- 端口,以及套接字描述符。
- 所有已连接客户端的信息。
- Lua脚本的运行环境及相关选项。
- 实现订阅与发布(pub/sub)功能所需的数据结构。
- 日志(log)和慢查询日志(slowlog)的选项和相关信息。
- 数据持久化(AOF和RDB)的配置和状态。
- 服务器配置选项:
- 比如要创建多少个数据库,
- 是否将服务器进程作为daemon进程来运行,
- 最大连接多少个客户端,
- 压缩结构(zip structure)的实体数量,等等。
- 统计信息:比如键有多少次命令、不命中,服务器的运行时间,内存占用,等等。
- 用户可能想使用 AOF 持久化,而不是默认的 RDB 持久化。
- 用户可能想用其他端口来运行Redis,以避免端口冲突。
- 用户可能不想使用默认的16个数据库,而是分配更多或更少数量的数据库。
- 用户可能想对默认的内存限制措施和回收策略做调整。
- 为server变量的数据结构子属性分配内存。
- 为数据结构分配内存,并初始化这些数据结构,等同于对相应的功能进行初始化
- 比如说,当为订阅与发布所需的链表分配内存之后,订阅与发布功能就处于就绪状态,随时可以为 Redis 所用了。
- 初始化这些数据结构。
- 初始化 Redis 进程的信号功能。
- 初始化日志功能。
- 初始化客户端功能。
- 初始化共享对象。
- 初始化事件功能。
- 初始化数据库。
- 初始化网络连接。
- 初始化订阅与发布功能。
- 初始化各个统计变量。
- 关联服务器常规操作(cron job)到时间事件,关联客户端应答处理器到文件事件。
- 如果AOF功能已打开,那么打开或创建AOF文件。
- 设置内存限制。
- 初始化Lua脚本环境。
- 初始化慢查询功能。
- 初始化后台操作线程。
- 服务器通过文件事件无阻塞地 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 对应的写事件就绪时,程序就会将保存在客户端结构回复缓存中的数据回写给客户端
- 当客户端接收到数据之后,它就将结果打印出来,显示给用户看
• 服务器经过初始化之后,才能开始接受命令。
• 服务器初始化可以分为六个步骤:
状态信息。
• 客户端向服务器发送命令,服务器接受命令然后将命令传给命令执行器,执行器执行给
转载于:https://www.cnblogs.com/Aiapple/p/7249237.html
redis--服务器与客户端相关推荐
- Redis源码解析:14Redis服务器与客户端间的交互
Redis服务器是典型的一对多服务器程序,通过使用由IO多路复用技术实现的文件事件处理器,Redis服务器使用单线程单进程的方式来处理命令请求,并与多个客户端进行网络通信. Redis客户端与服务器之 ...
- Redis连接命令,Redis安全策略,Redis客户端(client)命令,Redis服务器命令
目录 Redis连接命令详解 Redis连接命令 连接命令应用 Redis安全策略 命令配置密码 手动配置密码 指令安全 端口安全 SSH代理 Redis客户端(client)命令 Redis IO多 ...
- [ 搭建Redis本地服务器实践系列三 ] :图解Redis客户端工具连接Redis服务器
原文:[ 搭建Redis本地服务器实践系列三 ] :图解Redis客户端工具连接Redis服务器 上一章 [ 搭建Redis本地服务器实践系列二 ] :图解CentOS7配置Redis 介绍了Red ...
- 使用RedisDesktopManager客户端无法连接Redis服务器问题解决办法
使用RedisDesktopManager客户端无法连接Redis服务器问题解决办法 参考文章: (1)使用RedisDesktopManager客户端无法连接Redis服务器问题解决办法 (2)ht ...
- redis 服务器/客户端安装与配置
redis 服务器/客户端安装与配置 1 redis server 1.1 获取redis源码包 //官网 http://redis.io/ wget -c http://redis.googleco ...
- Redis源码剖析(一)服务器与客户端交互流程
Redis中的C/S模型 Redis底层还是基于网络请求的,对于单机数据库而言,网络请求仅仅是在一台机器上交互,即服务器客户端都在一台计算机上 当在终端输入redis-serve时,便启动了一个Red ...
- Redis基础(七)——事件、服务器、客户端、多线程
文章目录 事件.服务器.客户端.多线程 1 文件事件 2 时间事件 3 客户端 4 服务器 5 多线程 事件.服务器.客户端.多线程 Redis基于Reactor模式开发了一套高效的事件处理模型,通过 ...
- 运维Linux redis,系统运维|如何在 CentOS 7 上安装 Redis 服务器
大家好,本文的主题是 Redis,我们将要在 CentOS 7 上安装它.编译源代码,安装二进制文件,创建.安装文件.在安装了它的组件之后,我们还会配置 redis ,就像配置操作系统参数一样,目标就 ...
- redis源码客户端和服务端通信过程
最近想学习一下redis源码,先看一下redis通信流程.由于功力有限,不足之处望大家指正.服务端和客户端通信,一般都是服务端先启动,那先从服务端的源码看起. 首先启动服务端会做一些初始化动作,初始化 ...
- Redis 服务器管理相关命令
客户端相关 查看客户端列表 CLIENT LIST 自2.4.0可用. 时间复杂度:O(N) N是客户端连接数量. 语法:CLIENT LIST 说明: Redis CLIENT LIST 命令用于返 ...
最新文章
- Cesium Vue开发环境搭建
- [Python]网络爬虫(三):异常的处理和HTTP状态码的分类
- app爬虫Android 7证书设置
- python之协程函数、递归、二分法
- Android-通过Java代码来实现属性动画
- Dreamweaver网页设计与制作100例:用DIV+CSS技术设计的书法主题网站(web前端网页制作课作业)...
- python怎么开服务器,实战讲解:如何用Python搭建一个服务器
- 在互联网大厂,产品经理需要做的具体流程
- c语言char sex是什么意思,2012年计算机二级C语言入门教程:结构体
- 曲线曲面基本理论(二)
- [java学习笔记]-注解和反射
- 图片怎么识别文字?超实用的文字识别技巧分享,分享给你
- python基础螺旋线
- 用PC3000和HDD Unlock解笔记本硬盘密码
- 跨专业计算机考研难度,跨专业考研难度比较大的专业有哪些
- Android Google Face API 增强现实教程
- Android Studio 安装与配置
- 我用Python分析了翟天临的论文,学术还是要认真做啊
- Excel中日期、数字、中文大写金额等转文本
- 前端三剑客之HTML入门教程
热门文章
- httplistener java_Java监听器listener的介绍
- win10samba服务器配置_win10访问samba配置共享目录,踩坑记
- jmx.JmxAdminException
- mysql5.7.11解压安装_mysql 5.7.11解压安装教程
- 【2021杭电多校赛】2021“MINIEYE杯”中国大学生算法设计超级联赛(4)签到题4题
- 虚拟机linux gedit,Linux系统中把gedit改造成TextMate的方法
- java pipeline 实现_Docker+Jenkins+Pipeline实现持续集成(二)java项目构建
- LeetCode刷题目录
- CSS的一些基本样式的简单介绍
- iis php日志查看工具,教你如何查看IIS日志