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