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

[经验分享] 《Redis源码学习笔记》事件库

[复制链接]

尚未签到

发表于 2016-12-20 06:13:11 | 显示全部楼层 |阅读模式
《Redis源码学习笔记》文章列表
Redis没有使用第三方事件库来处理socket(譬如Libevent),而是自己实现了一个非常精巧的事件库(加上注释不到600行代码),这使得我们可以更加专注于Redis本身代码的阅读,而不必陷于三方库的学习和使用(我自己就是因为该原因选择学习Redis而不是memcache);同时阅读Redis自带的事件库也可以让我们一窥类似Libevent这样的事件库内部实现机制;
Redis事件库中的所有函数几乎都是以ae开头(原因不得而知),其中最重要的就是aeEventLoop对象,它充当着“事件处理器”角色:
DSC0000.png
其中“文件事件”是一个数组,存放当前Redis所有连接的客户端描述符,而“时间事件”则是一个链表,用来存放计划任务;
事件处理器循环流程由于图片较大,缩放较为模糊,请双击打开查看原图):
DSC0001.png
整个执行流程的伪代码:

def aeMain(aeEventLoop):
# 开始事件循环
while (not aeEventLoop.stop):
aeProcessEvents(aeEventLoop, AE_ALL_EVENTS)
def aeProcessEvents(aeEventLoop, flags):
# 是否需要处理时间事件
if flags & AE_TIME_EVENTS:
# 获取最近一个即将到达的时间事件
arrived_time = aeEventLoop.timeEvents.getNearestArrivedTime()
if (arrived_time < now_time):
# 若最近一个时间事件的arrived_time小于当前时间(说明需要立即执行),则设置文件事件为非阻塞
tvp.sec = 0
tvp.usec = 0
else:
# 否则取两者的时间间隔,作为文件事件的最大阻塞时间
tvp.sec = arrived_time.sec - now_time.sec
tvp.usec = arrived_time.usec - now_time.usec
else
# 文件事件是否阻塞
if flags & AE_DONT_WAIT:
tvp.sec = 0
tvp.usec = 0
else :
tvp = null
# 处理文件事件(IO多路复用)
# 若此时没有描述符就绪,tvp的值决定阻塞行为(立即返回?阻塞一段时间?一直阻塞下去?)
aeEventLoop.fileEvents.poll(tvp)
# 处理达到的时间事件
if (flags & AE_TIME_EVENTS):
aeEventLoop.timeEvents.processArrived()                                                                                                                       
更详细细节,请看:ae.h  ae.c
总结:
1. 了解文件事件和时间事件的概念;
2. 了解Redis事件库运行流程;

运维网声明 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-316524-1-1.html 上篇帖子: Redis(超高性能数据库)持久化Key-Value数据存储 下篇帖子: [转]Redis如何处理客户端连接
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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