[memcached分析]memcached的通讯层分析

memcached作为一种高性能的内存缓存服务器,在业界获得了广泛的应用。最近因工作需要好好分析了一下memcached的源码,有一些意外收获,用在项目中得到了很好的效果。所以给大家分享一下,希望抛砖引玉。


memcached在编译时候可以选择多线程和单线程两种模式,默认是单线程,不过在多核情况下,建议使用多线程方式,线程数推荐为cpu数。

[img]http://uniseraph.iteye.com/upload/attachment/43514/f999d404-51b0-34aa-8475-b240e9952e08.png[/img]

由上图,很容易分析出memcached的主要流程
1 初始化
1.1 在主线程中创建一个event_base , 监听connect/read 事件,主线程即是acceptor又是worker;
1.2 创建一个连接队列Connection_Queue
1.3 如果是多线程模式,则创建子线程,子线程中有自己的event_base,监听read事件,[color=red]子线程不处理connect请求[/color]。


2 处理建链请求
2.1 libevent将connect转发给主线程,调用主线程的event_handler方法;
2.2 从conneciton_queue中获取一个connection_queue_item , 如果没有空闲的item,则创建一个;
2.3 循环选择一个worker(包括主线程自己);
2.4 往目标worker的pipe写一个消息,告诉worker,这个新建的connection就交给你监控了。

3 处理命令
和client建立的socket已经分配给某个worker,由该worker的event_base使用reactor模式,依次处理其监控的socket上read事件。


memcached的实现特点

1. 主线程同时兼作acceptor/worker两个角色,很容易在单线程/多线程模式中切换;
2. 没有使用half async/half sync模式,直接在io线程中处理命令,这是和memcached的业务逻辑简单相关的,简化了系统机构的同时保证了高性能。
3. 在同一个socket上,命令处理是按顺序的,这是一个非常重要的特性,很有发挥余地,呵呵。

memcached的通讯层设计的非常好,有时间把这部分单独抽取出来,再加一个线程池,就可以满足大多数情景的需求了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值