设为首页 收藏本站
查看: 937|回复: 0

[经验分享] redis命令执行流程

[复制链接]

尚未签到

发表于 2016-12-19 09:07:47 | 显示全部楼层 |阅读模式
刚开始接触redis的时候为了了解redis的执行流程,粗略的翻了一下redis的源码然后画了一个草图。下面三张图分别代表了redis从开始启动到接收一个命令,再到把命令结果返回到客户端的过程,代码的执行顺序为每张图的从上到下从左到右。

图一:
DSC0000.png
  当redis启动的时候,从程序的入口处redis.c/main()方法开始执行,首先进行初始化工作,先绑定一个时间事件,然后为这个时间绑定serverCron()方法.serverCron方法会每100毫秒执行一次,主要负责一些维护工作,比如drop过期的键等。紧接着就是要去监听一个端口,比如默认的6379。然后就走到初始化工作的末尾,为刚才监听的socket注册一个AE_READABLE事件,并为该事件绑定一个acceptTcpHandler方法,从名字上可以看出,该方法用于接收客户端的socket。

初始化工作完成之后就是要接收socket了,在aeMain方法中循环去调用aeProcessEvents方法,该方法每次都去IO多路复用器中获取已经就绪是事件,然后根据事件的类型对其进行分离,并执行相应的方法(fe->rfileProc或fe->wfileProc)。如果是第一次执行,因为在初始化的时候注册了一个fe->rfileProc=acceptTcpHandler,所以这里就会执行acceptTcpHandler这个方法。最后执行时间事件。
  
  到此,redis就算启动完成了,然后就是通过循环去处理就绪的事件以及每个事件对应的方法。
  
图二:
DSC0001.png
  从这张图可以看到acceptTcpHandler方法首先会创建一个客户端socket,然后为该socket注册AE_READBLE事件并绑定readQueryFromClient方法,这个方法用来解析并执行我们请求的命令,如set foo value等。注意这时候并没有执行,只是注册了一个事件,一单客户端的socket可读了,在aeMain方法下次循环时会通过图一中的aeApiPoll体现出来,最后才会通过fe->rfileProc去执行命令请求。

  接下来图三说明了readQueryFromClient都做了什么事。
图三:
DSC0002.png
  readQueryFromClient方法首先将命令读到每个客户端(socket)的缓冲区,然后通过一系列命令校验,最终通过call去执行命令并执行addReply方法,这个方法要做的事情就是为该客户端注册AE_WRITABLE事件并绑定sendReplyToClient方法,然后将要恢复的结果放入到该客户端的缓冲区。最后等该客户端可以写数据的时候,将结果发送给客户端。
  
  这些事情做完之后接着就处理aof和从节点的问题,如果aof是开着的就调用feedAppendOnlyFile方法,该方法负责将命令放入到缓存中,最后有flushAppendOnlyFile将缓存写入到aof中,serverCron方法负责定期的调用flushAppendOnlyFile方法。最后如果有从节点的话就调用replicationFeedSlaves方法,该方法和上面的call方法一样会执行addReply方法,然后为所有的从节点注册相应的事件和方法,最终将命令发送给所有的从节点。

  需要注意的是所有这些动作都是通过事件驱动的。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-316211-1-1.html 上篇帖子: php与redis使用经验分享 下篇帖子: 3.redis.conf配置选项
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表