Redis服务器

2018/02/08 Redis

Redis服务器

Redis服务器负责与多个客户端建立网络连接,处理客户端发送的命令请求,在数据库中保存客户端执行命令所产生的数据,并通过资源管理来维持服务器自身的运转。

服务端定义

结构体redisServer存储Redis服务器的所有信息,包括但不限于数据库、配置参数、命令表、监听端口与地址、客户端列表、若干统计信息、RDB与AOF持久化相关信息、主从复制相关信息、集群相关信息等。 结构体redisServer的字段非常多,这里只对部分字段做简要说明 。结构体redisServer定义如下:

struct redisServer {
    char *configfile;

    int dbnum;
    redisDb *db;
    dict *commands;

    aeEventLoop *el;

    int port;
    char *bindaddr[CONFIG_BINDADDR_MAX];
    int bindaddr_count;
    int ipfd[CONFIG_BINDADDR_MAX]; 
    int ipfd_count;

    list *clients; 
    int maxidletime;
}

各字段含义如下。

  • configfile:配置文件绝对路径。
  • dbnum:数据库的数目,可通过参数databases配置,默认16。
  • db:数据库数组,数组的每个元素都是redisDb类型。
  • commands:命令字典,Redis支持的所有命令都存储在这个字典中,key为命令名称,vaue为struct redisCommand对象,将在9.1.4节详细介绍。
  • el:Redis是典型的事件驱动程序,el代表Redis的事件循环,类型为aeEventLoop,将在9.1.5节详细介绍。
  • port:服务器监听端口号,可通过参数port配置,默认端口号6379。
  • bindaddr:绑定的所有IP地址,可以通过参数bind配置多个,例如bind 192.168.1.10010.0.0.1,bindaddr_count为用户配置的IP地址数目;CONFIG_BINDADDR_MAX常量为16,即最多绑定16个IP地址;Redis默认会绑定到当前机器所有可用的Ip地址。
  • ipfd:针对bindaddr字段的所有IP地址创建的socket文件描述符,ipfd_count为创建的socket文件描述符数目。
  • clients:当前连接到Redis服务器的所有客户端。
  • maxidletime:最大空闲时间,可通过参数timeout配置,结合client对象的lastinteraction字段,当客户端没有与服务器交互的时间超过maxidletime时,会认为客户端超时并释放该客户端连接。

初始化服务器

一个Redis服务器从启动到能够接受客户端的命令请求,需要经过一系列的初始化和设置过程,比如初始化服务器状态,接受用户指定的服务器配置,创建相应的数据结构和网络连接等等 服务器初始化主流程(见图9-2)可以简要分为7个步骤:①初始化配置,包括用户可配置的参数,以及命令表的初始化;②加载并解析配置文件;③初始化服务端内部变量,其中就包括数据库;④创建事件循环eventLoop;⑤创建socket并启动监听;⑥创建文件事件与时间事件;⑦开启事件循环。

初始化服务器状态结构

命令请求的执行过程

一个命令请求从发送到获得回复的过程中,客户端和服务器需要完成一系列操作。举个例子,如果我们使用客户端执行以下命令:

redis> SET KEY VALUE
OK

那么从客户端发送SET KEY VALUE命令到获得回复OK期间,客户端和服务器共需要执行以下操作:

  • 客户端向服务器发送命令请求SET KEY VALUE。
  • 服务器接收并处理客户端发来的命令请求SET KEY VALUE,在数据库中进行设置操作,并产生命令回复OK。
  • 服务器将命令回复OK发送给客户端。
  • 客户端接收服务器返回的命令回复OK,并将这个回复打印给用户观看。

发送命令请求

Redis服务器的命令请求来自Redis客户端,当用户在客户端中键入一个命令请求时,客户端会将这个命令请求转换成协议格式,然后通过连接到服务器的套接字,将协议格式的命令请求发送给服务器 举个例子,假设用户在客户端键入了命令:

SET KEY VALUE

那么客户端会将这个命令转换成协议:

*3\r\n$3\r\nSET\r\n$3\r\nKEY\r\n$5\r\nVALUE\r\n

然后将这段协议内容发送给服务器。

读取命令请求

当客户端与服务器之间的连接套接字因为客户端的写入而变得可读时,服务器将调用命令请求处理器来执行以下操作:

  • 读取套接字中协议格式的命令请求,并将其保存到客户端状态的输入缓冲区里面。
  • 对输入缓冲区中的命令请求进行分析,提取出命令请求中包含的命令参数,以及命令参数的个数,然后分别将参数和参数个数保存到客户端状态的argv属性和argc属性里面。
  • 调用命令执行器,执行客户端指定的命令。

Search

    微信好友

    博士的沙漏

    Table of Contents