redis 使用addReply系列函数发送查询结果以及错误信息给客户端。这一篇我们来研究redis是如何组织并发送这些消息的。
当网络连接准备好之后redis就会开始等待接收网络数据并处理。
还记得我们在分析createClient这个函数的时候,当conn不为空时的处理吗?
1 if (conn) {
2 connNonBlock(conn);
3 connEnableTcpNoDelay(conn);
4 if (server.tcpkeepalive)
5 connKeepAlive(conn,server.tcpkeepalive);
6 connSetReadHandler(conn, readQueryFromClient);
7...
redis服务器启动过程
redis经历了长时间的发展,已经从一个简单的内存数据库变为了一个复杂的内存数据库系统。所以启动就包含了很多子系统的初始化过程。我们这里讲启动的流程只能先梳理以下redis启动的脉络,一些子系统的初始化细节还是要放到后续的章节再讲。
redis启动的过程也是redisServer结构初始化的过程,该结构保存了redis server的所有配置信息,我尽量将这个结构中各个字段的用途进行解释如有疏漏还请指正。
入口
redis server的main函数在server.c这个文件中,之前说的redisServer结构保存在server.h中,这个结构足足有500多行,包括指令表、AOF日志、运行时状态、统计数...
ziplist
ziplist 作为redis常用的数据结构主要用于小数据量的压缩存储。在数据量较小的情况下,将数据紧凑排列可以有效利用CPU cache,有助于提高缓存命中,让数据读写更加迅速。
ziplist的数据定义很简单,如下:
1/* Each entry in the ziplist is either a string or an integer. */
2typedef struct {
3 /* When string is used, it is provided with the length (slen). */
4 unsigned char *sval;
5 unsigned int...