5.5 服务器与客户端
5.5.4 命令请求实例:SET 的执行过程
为了更直观地理解命令执行的整个过程,我们用一个实际执行 SET 命令的例子来讲解命令执 行的过程。
158 Chapter 5. 内部运作机制
Redis 设计与实现, 第一版
假设现在客户端 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 对应的写事件就绪时,程序就会将保存在客户端结构回复缓存中的数据回写给客户端,
当客户端接收到数据之后,它就将结果打印出来,显示给用户看。
以上就是 SET YEAR 2013 命令执行的整个过程。
5.5.5 小结
• 服务器经过初始化之后,才能开始接受命令。
• 服务器初始化可以分为六个步骤:
1. 初始化服务器全局状态。
2. 载入配置文件。
3. 创建 daemon 进程。
4. 初始化服务器功能模块。
5. 载入数据。
6. 开始事件循环。
• 服务器为每个已连接的客户端维持一个客户端结构,这个结构保存了这个客户端的所有 状态信息。
• 客户端向服务器发送命令,服务器接受命令然后将命令传给命令执行器,执行器执行给 定命令的实现函数,执行完成之后,将结果保存在缓存,最后回传给客户端。
160 Chapter 5. 内部运作机制
第 6 章
关于
本书由 huangz编写。
我在研究 Redis 源码并创作本书的过程中获得了极大的快乐,希望你在阅读本书时也能有同感。
评论、问题、意见或建议都可以发表在本书自带的 disqus 论坛里,也可以通过 豆瓣、微博 或 Twitter 联系我,我会尽可能地回复。
要获得本书的最新动态,请关注 redisbook项目。
要了解编写本书时用到的工具(源码管理、文档的生成和托管、图片生成,等等),请阅读 这 篇文章 。
下载本书离线版本:pdf 格式 或html 格式 。在线阅读本书请访问redisbook.com 。
162 Chapter 6. 关于
第 7 章
通过捐款支持本书
如果你喜欢这本《Redis 设计与实现》的话,可以通过捐款的方式,支持作者继续更新本书:比 如为本书修补漏洞、添加更多有趣的章节,或者发行有更多更棒内容的下一版,等等。
捐款地址:https://me.alipay.com/huangz