设为首页 加入收藏

TOP

Redis客户端和服务端初始化教程(一)
2018-03-18 16:21:52 】 浏览:498
Tags:Redis 客户端 服务 初始 教程

1.初始化服务器

从启动 Redis 服务器,到服务器可以接受外来客户端的网络连接这段时间,Redis 需要执行一系列初始化操作。

整个初始化过程可以分为以下六个步骤:

初始化服务器全局状态。 载入配置文件。 创建 daemon 进程。 初始化服务器功能模块。 载入数据。 开始事件循环

1.1.初始化服务器全局状态

redis.h/redisServer结构记录了和服务器相关的所有数据,这个结构主要包含以下信息:

服务器中的所有数据库。 命令表:

在执行命令时,根据字符来查找相应命令的实现函数。 事件状态。 服务器的网络连接信息:

套接字地址 端口,以及套接字描述符。 所有已连接客户端的信息。 Lua脚本的运行环境及相关选项。 实现订阅与发布(pub/sub)功能所需的数据结构。 日志(log)和慢查询日志(slowlog)的选项和相关信息。 数据持久化(AOF和RDB)的配置和状态。 服务器配置选项:

比如要创建多少个数据库, 是否将服务器进程作为daemon进程来运行, 最大连接多少个客户端, 压缩结构(zip structure)的实体数量,等等。 统计信息:比如键有多少次命令、不命中,服务器的运行时间,内存占用,等等。

上述过程只包含=Redis服务器单机信息,不包含sentinel,cluster等功能。

当 server 变量的初始化完成之后,程序进入服务器初始化的下一步:读入配置文件。

1.2载入配置文件

在初始化服务器的上一步中,程序为server变量(也即是服务器状态)的各个属性设置了默

认值,但这些默认值有时候并不是最合适的:

- 用户可能想使用 AOF 持久化,而不是默认的 RDB 持久化。

- 用户可能想用其他端口来运行Redis,以避免端口冲突。

- 用户可能不想使用默认的16个数据库,而是分配更多或更少数量的数据库。

- 用户可能想对默认的内存限制措施和回收策略做调整。

1.创建daemon进程

Redis默认以daemon进程的方式运行。

当服务器初始化进行到这一步时,程序将创建 daemon 进程来运行 Redis ,并创建相应的 pid文件。

2.初始化服务器功能模块

在这一步,初始化程序完成两件事:

为server变量的数据结构子属性分配内存。

为数据结构分配内存,并初始化这些数据结构,等同于对相应的功能进行初始化 比如说,当为订阅与发布所需的链表分配内存之后,订阅与发布功能就处于就绪状态,随时可以为 Redis 所用了。 初始化这些数据结构。

在这一步,程序完成的主要动作如下:

初始化 Redis 进程的信号功能。 初始化日志功能。 初始化客户端功能。 初始化共享对象。 初始化事件功能。 初始化数据库。 初始化网络连接。 初始化订阅与发布功能。 初始化各个统计变量。 关联服务器常规操作(cron job)到时间事件,关联客户端应答处理器到文件事件。 如果AOF功能已打开,那么打开或创建AOF文件。 设置内存限制。 初始化Lua脚本环境。 初始化慢查询功能。 初始化后台操作线程。

完成这一步之后,服务器打印出 Redis 的 ASCII LOGO 、服务器版本等信息,表示所有功能

模块已经就绪,可以等待被使用了:

虽然所有功能已经就绪,但这时服务器的数据库还是一片空白,程序还需要将服务器上一次执

行时记录的数据载入到当前服务器中,服务器的初始化才算真正完成。

3.载入数据

在这一步,程序需要将持久化在 RDB 或者 AOF 文件里的数据,载入到服务器进程里面。

如果服务器有启用AOF功能的话,那么使用AOF文件来还原数据;

否则,程序使用RDB文件来还原数据。

当执行完这一步时,服务器打印出一段载入完成信息:

[6717] 22 Feb 11:59:14.830 * DB loaded from disk: 0.068 seconds

4.开始事件循环

到了这一步,服务器的初始化已经完成,程序打开事件循环,开始接受客户端连接。

以下是初始化完成之后,服务器状态和各个模块之间的关系图:

5.命令的请求,处理和结果返回

当客户端连上服务器之后,客户端就可以向服务器发送命令请求了。

从客户端发送命令请求,到命令被服务器处理、并将结果返回客户端,整个过程有以下步骤:

客户端通过套接字向服务器传送命令协议数据。 服务器通过读事件来处理传入数据,并将数据保存在客户端对应 redisClient 结构的查询缓存中。 根据客户端查询缓存中的内容,程序从命令表中查找相应命令的实现函数。 程序执行命令的实现函数,修改服务器的全局状态 server 变量,并将命令的执行结果保存到客户端 redisClient 结构的回复缓存中,然后为该客户端的 fd 关联写事件。 当客户端 fd 的写事件就绪时,将回复缓存中的命令结果传回给客户端。至此,命令执行完毕。

6.命令请求实例:set 的执行过程

假设现在客户端 C1 是连接到服务器 S 的一个客户端;

当用户执行命令 SET YEAR 2013 时 过程:

客户端调用写入函数,将协议内容 写入连接到服务器的套接字中。

协议内容:*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 对应的写事件就绪时,程序就会将保存在客户端结构回复缓存中的数据回写给客户端 当客户端接收到数据之后,它就将结果打印出来,显示给用户看

2.客户端

redis 服务器是典型的一对多服务器程序:一个服务器可以和多个客户端建立网络连接,每个客户端可以向服务器发送命令请求,而服务器则接收并处理客户端发送的请求,并向客户端返回相应的信息。

redis 服务器通过使用 I/O 多路复用技术实现的文件处理系统,Redis 服务器使用单线程单进程的方式处理命令请求,并与多个客户端进行网络通信。

对于每一个与服务器进行连接的客户端,服务器都为这些客户端建立相应的 redis.h/redisClient 结构,这个结构保存了客户端当前的状态信息,以及执行相关功能时需要用到的数据结构。

Redis 通过监听一个 TCP 端口或者 Unix socket 的方式来接收来自客户端的连接,当一个连接建立后,Redis 内部会进行以下一些操作:

首先,客户端 socket 会被设置为非阻塞模式,因为 Redis 在网络事件处理上采用的是非阻塞多路复用模型。

然后为这个 socket 设置 TCP_NODELAY 属性,禁用 Nagle 算法

然后创建一个可读的文件事件用于监听这个客户端 soc

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇MySQL binlog解析之QUERY_EVENT 下一篇IJ连接sql后加载jdbc驱动的方法教..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目