基础数据结构:
/* The actual Redis Object */
#define OBJ_STRING 0
#define OBJ_LIST 1
#define OBJ_SET 2
#define OBJ_ZSET 3
#define OBJ_HASH 4
//proper sds
#define OBJ_ENCODING_RAW 0 /* Raw representation */
//if len <= 20; long value; o->ptr = (void*) value;
#define OBJ_ENCODING_INT 1 /* Encoded as integer */
#define OBJ_ENCODING_HT 2 /* Encoded as hash table */
#define OBJ_ENCODING_ZIPMAP 3 /* Encoded as zipmap */
#define OBJ_ENCODING_LINKEDLIST 4 /* No longer used: old list encoding. */
#define OBJ_ENCODING_ZIPLIST 5 /* Encoded as ziplist */
#define OBJ_ENCODING_INTSET 6 /* Encoded as intset */
#define OBJ_ENCODING_SKIPLIST 7 /* Encoded as skiplist */
//sds8
#define OBJ_ENCODING_EMBSTR 8 /* Embedded sds string encoding */
#define OBJ_ENCODING_QUICKLIST 9 /* Encoded as linked list of ziplists */
网络模块:
初始化:
接收数据流程:
ae_epoll.c:
初始化epoll,添加,删除,wait
ae.c事件管理:
aeProcessEvents;
event wait 超时时间的特殊处理;
对响应事件的处理;
Timer处理;
aeWait,Wait for milliseconds until the given file descriptor becomes writable/readable/exception,链接验证
anet.c socket相关:
阻塞非阻塞设置
Connect
fd/ip/port等解析
networking.c 网络处理:
acceptTcpHandler;
发送数据:
- addReply
- prepareClientToWrite,把c加入server.clients_pending_write链表;
- _addReplyToBuffer,把数据存储到c->buf;
- 上一步失败则调用_addReplyObjectToList,对象入队c->reply;
- handleClientsWithPendingWrites
- 在event loop前处理clients_pending_write,从链表删除client
- writeToClient-》write发送数据,如果没有数据要处理删除写事件
- aeCreateFileEvent创建写事件回调sendReplyToClient
- sendReplyToClient-》writeToClient
读事件处理:
- readQueryFromClient-》写入c->querybuf,如果是master请求写入c->pending_querybuf
- processInputBuffer-》
- 请求类型分PROTO_REQ_MULTIBULK(开头是*的,比如外部使用者发送命令),和PROTO_REQ_INLINE
- 协议解析,multi使用processMultibulkBuffer,inline使用processInlineBuffer
- processCommand
- 如果是master请求,可能调用replicationFeedSlavesFromMasterStream
其他模块:
server.c:
server.clients
server.unblocked_clients
过期处理:
db->expires,过期字典,value是结束时间;
beforeSleep-》启动过期处理,且是master, activeExpireCycle(ACTIVE_EXPIRE_CYCLE_FAST);
databasesCron-》启动过期处理,且是master, activeExpireCycle(ACTIVE_EXPIRE_CYCLE_SLOW);
activeExpireCycle-》
- 小于1%填充不处理
- 一定次数循环,从db->expires随机获取判断并删除,删除又分同步和异步,删除前propagateExpire,传播删除操作到AOF和slave
- 达到处理时间则终止
databasesCron-》expireSlaveKeys,处理意外情况,可写的slave创建并设置ttl的key,master不知道的情况,通过slaveKeysWithExpire集合进行操作
主从交互:
slaves:
读事件处理,readQueryFromClient-》replicationFeedSlavesFromMasterStream-》
- 如果分配了repl_backlog,再feedReplicationBacklog,向环形buffer填充数据
- 遍历slaves,addReplyString,作为proxy转发数据
master:
propagate,beforeSleep,replicationCron,这三个函数都会调用replicationFeedSlaves,向slaves同步数据
replicationFeedSlaves
- feedReplicationBacklog-》repl_backlog,向环形buffer填充数据,multi bulk,’*‘cnt\r\n + $len\r\n + data
- 遍历slaves,addReplyMultiBulkLen,向reply添加argc值,即对象个数
- addReplyBulk,向reply添加长度 + 数据
cluster:
命令处理:
流程:
processInputBuffer-》processCommand-》获取命令,用户认证,最大内存处理,写命令是否可以执行验证,queueMultiCommand-》添加命令到c->mstate.commands队列,addReply
哨兵:
客户端: