redis源码解析

基础数据结构:

/* 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;

发送数据

  1. addReply
    1. prepareClientToWrite,把c加入server.clients_pending_write链表;
    2. _addReplyToBuffer,把数据存储到c->buf;
    3. 上一步失败则调用_addReplyObjectToList,对象入队c->reply;
  2. handleClientsWithPendingWrites
    1. 在event loop前处理clients_pending_write,从链表删除client
    2. writeToClient-》write发送数据,如果没有数据要处理删除写事件
    3. aeCreateFileEvent创建写事件回调sendReplyToClient
  3. sendReplyToClient-》writeToClient

读事件处理:

  1. readQueryFromClient-》写入c->querybuf,如果是master请求写入c->pending_querybuf
  2. processInputBuffer-》
    1. 请求类型分PROTO_REQ_MULTIBULK(开头是*的,比如外部使用者发送命令),和PROTO_REQ_INLINE
    2. 协议解析,multi使用processMultibulkBuffer,inline使用processInlineBuffer
    3. processCommand
  3. 如果是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. 小于1%填充不处理
  2. 一定次数循环,从db->expires随机获取判断并删除,删除又分同步和异步,删除前propagateExpire,传播删除操作到AOF和slave
  3. 达到处理时间则终止

databasesCron-》expireSlaveKeys,处理意外情况,可写的slave创建并设置ttl的key,master不知道的情况,通过slaveKeysWithExpire集合进行操作

主从交互:

slaves:

读事件处理,readQueryFromClient-》replicationFeedSlavesFromMasterStream-》

  1. 如果分配了repl_backlog,再feedReplicationBacklog,向环形buffer填充数据
  2. 遍历slaves,addReplyString,作为proxy转发数据

master:

propagate,beforeSleep,replicationCron,这三个函数都会调用replicationFeedSlaves,向slaves同步数据

replicationFeedSlaves

  1. feedReplicationBacklog-》repl_backlog,向环形buffer填充数据,multi bulk,’*‘cnt\r\n + $len\r\n + data
  2. 遍历slaves,addReplyMultiBulkLen,向reply添加argc值,即对象个数
  3. addReplyBulk,向reply添加长度 + 数据

cluster:

命令处理:

流程:

processInputBuffer-》processCommand-》获取命令,用户认证,最大内存处理,写命令是否可以执行验证,queueMultiCommand-》添加命令到c->mstate.commands队列,addReply


 

哨兵:

客户端:


 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MyObject-C

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值