• 沒有找到結果。

初始化服务器

5.5 服务器与客户端

5.5.1 初始化服务器

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

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

1. 初始化服务器全局状态。

2. 载入配置文件。

3. 创建 daemon 进程。

4. 初始化服务器功能模块。

5. 载入数据。

6. 开始事件循环。

以下各个小节将介绍 Redis 服务器初始化的各个步骤。

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

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

• 服务器中的所有数据库。

• 命令表:在执行命令时,根据字符来查找相应命令的实现函数。

• 事件状态。

• 服务器的网络连接信息:套接字地址、端口,以及套接字描述符。

• 所有已连接客户端的信息。

• Lua 脚本的运行环境及相关选项。

• 实现订阅与发布(pub/sub)功能所需的数据结构。

• 日志(log)和慢查询日志(slowlog)的选项和相关信息。

• 数据持久化(AOF 和 RDB)的配置和状态。

• 服务器配置选项:比如要创建多少个数据库,是否将服务器进程作为 daemon 进程来运 行,最大连接多少个客户端,压缩结构(zip structure)的实体数量,等等。

• 统计信息:比如键有多少次命令、不命中,服务器的运行时间,内存占用,等等。

Note: 为了简洁起见,上面只列出了单机情况下的 Redis 服务器信息,不包含 SENTINEL 、 MONITOR 、CLUSTER 等功能的信息。

在这一步,程序创建一个 redisServer 结构的实例变量 server 用作服务器的全局状态,并将 server 的各个属性初始化为默认值。

154 Chapter 5. 内部运作机制

Redis 设计与实现, 第一版

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

2. 载入配置文件

在初始化服务器的上一步中,程序为 server 变量(也即是服务器状态)的各个属性设置了默 认值,但这些默认值有时候并不是最合适的:

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

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

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

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

等等。

为了让使用者按自己的要求配置服务器,Redis 允许用户在运行服务器时,提供相应的配置文 件(config file)或者显式的选项(option),Redis 在初始化完 server 变量之后,会读入配置 文件和选项,然后根据这些配置来对 server 变量的属性值做相应的修改:

1. 如果单纯执行 redis-server 命令,那么服务器以默认的配置来运行 Redis 。

2. 另一方面,如果给 Redis 服务器送入一个配置文件,那么 Redis 将按配置文件的设置来 更新服务器的状态。

比如说,通过命令 redis-server /etc/my-redis.conf ,Redis 会根据 my-redis.conf 文件的内容来对服务器状态做相应的修改。

3. 除此之外,还可以显式地给服务器传入选项,直接修改服务器配置。

举个例子,通过命令 redis-server --port 10086 ,可以让 Redis 服务器端口变更为 10086 。

4. 当然,同时使用配置文件和显式选项也是可以的,如果文件和选项有冲突的地方,那么优 先使用选项所指定的配置值。

举个例子,如果运行命令 redis-server /etc/my-redis.conf --port 10086 ,并且 my-redis.conf 也指定了 port 选项,那么服务器将优先使用 --port 10086 (实际上是 选项指定的值覆盖了配置文件中的值)。

3. 创建 daemon 进程

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

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

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

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

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

为数据结构分配内存,并初始化这些数据结构,等同于对相应的功能进行初始化。

| `-._`-._ _.-'_.-' | http://redis.io

`-._ `-._`-.__.-'_.-' _.-'

Redis 设计与实现, 第一版

5. 载入数据

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

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

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

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

6. 开始事件循环

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

以下是服务器在这一步打印的信息:

[6717] 22 Feb 11:59:14.830 * The server is now ready to accept connections on port 6379 以下是初始化完成之后,服务器状态和各个模块之间的关系图: