redis 执行命令流程以及repl backlog 复制挤压缓冲区源码

1 首先通过eventloo死循环配合I/O多路复用监听有网络事件的socket
2 通过I/O多路复用拿到socket的fd后,调用对应的回调函数readQueryFromClient
3 通过read函数读取内容到querybuf (默认为1GB)
4 如果当前client是master则将querybuf的内容拷贝到pending_qurybuf(这个是主从同步的replication buffer,redis将会吧pending_qurybuf里面的内容同步给salve)
5 根据redis的resp协议开始处理解析命令*\r\n\r\n3\r\nset\r\n4\r\nname\r\n3\r\nddd\r\n
6 先拿到命令的总个数3,然后循环三次开始解析每个命令的字符,将解析出来的参数放入argv中,以redisobject的形式存在,robj的ptr指向底层真正的数据比如sds字符串;
7 将robj中的buf存入命令 例如set name 123 那么 将会有三个robj 每个robj的ptr都是一个sds字符串,每个sds的字符串的buf分别人set name 123
8 解析完以后调用processCommand执行命令(这个后面在分析 目前还没看)然后更新reploff(代表当前已经应用了的query_buffer里面的数据)
9 如果是master,还需要将这些应用了的数据放入backlog buffer中也就是用于主从同步中的增量复制psync命令
10 同时将master的pending_qurybuf的内容写入master下所有的slave的buf;然后将这些slave加入带同步队列,在下一次的eventloop循环中将数据同步给对应的slave
11 如果数据过多,会将对应的socket fd注册一个fileEvent等待下一次可写时进行处理;(可写前面已经讲过,可写指的是,write不会被阻塞)

讲一下backlog buffer如何计算的看下面的源码

  • repl_backlog_size 代表当前backlog缓存区的大小
  • repl_backlog_idx 代表下一次要写入的位置
  • repl_backlog_histlen 代表当前积压的数据长度
  • master_repl_offset 代表当前最大的offset
  • repl_backlog_off 代表当前可用的最小的offset
void feedReplicationBacklog
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值