ket 的数据发送
2.1.客户端连接到服务器
当 Redis 服务器完成初始化之后,它就准备好可以接受外来客户端的连接了。
当一个客户端通过套接字函数 connect 到服务器时,服务器执行以下步骤:
服务器通过文件事件无阻塞地 accept 客户端连接,并返回一个套接字描述符 fd 。 服务器为 fd 创建一个对应的 redis.h/redisClient 结构实例,并将该实例加入到服务器的已连接客户端的链表中。 服务器在事件处理器为该 fd 关联读文件事件。
完成这三步之后,服务器就可以等待客户端发来命令请求了。
Redis 以多路复用的方式来处理多个客户端,为了让多个客户端之间独立分开、不互相干扰,
服务器为每个已连接客户端维持一个 redisClient 结构,从而单独保存该客户端的状态信息。
redisClient 结构主要包含以下信息:
套接字描述符。 客户端正在使用的数据库指针和数据库号码。 客户端的查询缓存( query buffer)和回复缓存( reply buffer)。 一个指向命令函数的指针,以及字符串形式的命令、命令参数和命令个数,这些属性会在命令执行时使用。 客户端状态:
记录了客户端是否处于 SLAVE MONITOR 或者事务状态。 实现事务功能(比如 MULTI 和 WATCH)所需的数据结构。 实现阻塞功能(比如 BLPOP 和 BRPOPLPUSH)所需的数据结构。 实现订阅与发布功能(比如PUBLISH和SUBSCRIBE)所需的数据结构。 统计数据和选项:客户端创建的时间,客户端和服务器最后交互的时间,缓存的大小,等等。
注意:上面列出的客户端结构信息不包含复制相关属性;
3.小结
服务器经过初始化之后,才能开始接受命令。
服务器初始化可以分为六个步骤:
1. 初始化服务器全局状态。
2. 载入配置文件。
3. 创建 daemon 进程。
4. 初始化服务器功能模块。
5. 载入数据。
6. 开始事件循环。
服务器为每个已连接的客户端维持一个客户端结构,这个结构保存了这个客户端的所有
状态信息。
客户端向服务器发送命令,服务器接受命令然后将命令传给命令执行器,执行器执行给
定命令的实现函数,执行完成之后,将结果保存在缓存,最后回传给客户端。