`
uniseraph
  • 浏览: 82512 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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

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


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



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


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的通讯层设计的非常好,有时间把这部分单独抽取出来,再加一个线程池,就可以满足大多数情景的需求了。
  • 大小: 97.8 KB
分享到:
评论
2 楼 uniseraph 2008-10-22  
liuye 写道

老大,memcached在编译时候怎么选择多线程和单线程模式?

./configure --enable-threads
1 楼 liuye 2008-10-21  
老大,memcached在编译时候怎么选择多线程和单线程模式?

相关推荐

    易语言-Memcached协议客户端模块

    利用网络通讯支持库实现Memcached协议的易语言应用。 资源下载:

    memcached:计划将Memcached工作贡献回memcached

    欢迎来到Couchbase memcached项目。 这开始于上游memcached项目的Couchbase分支。 此后此后一直在发展,因此尽管它与上游项目共享一个名称,但除了名称之外,其他许多事情都发生了变化:)...分析jemalloc内存统计信息

    Java主流分布式解决方案多场景设计与实战-全新课程资料

    Redis+MongoDB+Memcached/通讯:RabbitMQ+RocketMQ+Kafka)性能优化:Mysql优化+Java性能调优+JVM调优+Tomcat调优 此资源以开发简化版Spring学习其原理和内核,不仅是代码编写实现也更注重内容上的需求分析和方案...

    Redis数据库的应用场景介绍

    一、MySql+Memcached架构的问题 实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访问,很多公司都曾经使用过这样的架构,但随着业务数据量的不断增加,和访问量的持续增长,我们遇到...

    Java架构面试资料合集Spring面试专题及答案MySQL面试Redis面试资料.zip

    分布式数据库面试专题系列:Memcached+Redis+MongoDB 分布式通讯面试专题系列:ActiveMQ+RabbitMQ+Kafka 分布式限流面试专题系列:Nginx+zookeeper 开源框架面试题系列:Spring+SpringMVC+MyBatis 微服务架构面试...

    thinkphp-bjyblog v1.1

    想研究支付宝、微信支付、邮件发送、短信通知验证码发送、oss云存储、融云即时通讯、友盟推送、Memcached缓存、权限管理、等更多功能的可以参考进阶版的bjyadmin。使用说明请将项目内的所有文件直接放在根目录下;...

    NoSQL数据库tiger.zip

     主要技术: erlang:用于socket和通讯层  Zab(Zookeeper Atomic Broadcast):实现消息的原子广播 存储引擎:leveldb,redis存储引擎 架构实现:zab_engine介绍:将zab协议实现为erlang的api,如果使用...

    Danga Socket

    memcached的官方客户端,就是基于这个Socket组件的

    Java程序员面试题全.zip

    包含分布式数据库面试专题系列:Memcached+Redis+MongoDB、分布式通讯面试专题系列:ActiveMQ+RabbitMQ+Kafka、分布式限流面试专题系列:Nginx+zookeeper、集合、开源框架面试题系列:Spring+SpringMVC+MyBatis、23...

    最全的Java程序员知识(专业知识+面试+视频教程)学习资料合集.zip

    分布式通讯面试专题系列:ActiveMQ+RabbitMQ+Kafka 分布式数据库面试专题系列:Memcached+Redis+MongoDB 对标年薪60W的阿里P7 Java高频面试题库 Spring面试专题及答案整理文档 MySQL性能优化的21个最佳实践 JVM与...

    java开源包8

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

    baixiu:这是一个我用自己的框架进行的项目,它模拟了ThinkPHP

    3,pdo模型与mysql进行通讯; 4,发送电子邮件,使用phpmailer类,用户新浪邮件代理服务器; 5,使用mysql保存会话; 6,使用memcached保存一些数据,减少对mysql的要求; 7,使用phpminify缩小js / css文件的大小...

    noria:通过动态的部分状态数据流实现快速的Web应用程序

    这使当前正在与MySQL或MariaDB通讯的所有应用程序切换到Noria只需很少的工作。 例如,运行,向真正的发出,Noria将吞吐量提高了5倍: 在较高的级别上,Noria接受一组参数化SQL查询(认为是),并生成一个,该维护...

    java开源包1

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

    java开源包11

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

    java开源包2

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

    java开源包3

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

    java开源包6

    JCarder 是一个用来查找多线程应用程序中一些潜在的死锁,通过对 Java 字节码的动态分析来完成死锁分析。 Java的Flash解析、生成器 jActionScript jActionScript 是一个使用了 JavaSWF2 的 Flash 解析器和生成器。...

Global site tag (gtag.js) - Google Analytics