`
uniseraph
  • 浏览: 83586 次
  • 性别: 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在编译时候怎么选择多线程和单线程模式?

相关推荐

    windows系统安装memcached缓存系统

    这通常涉及到下载memcached的Windows版本,设置服务,以及可能的自定义配置,例如改变默认的通讯端口号。 **描述详解:**“windows系统下安装memcached缓存系统。资源包括memcached文件及安装方法,及修改端口号的...

    memcached面试专题及答案.pdf

    Memcached服务器之间不需要相互通讯,所以也不会增加额外的负载。当系统需要更多内存或CPU资源时,简单地增加服务器即可。 ### 架构特点 Memcached基于事件的架构使它成为非阻塞服务器,能够处理大量的并发连接,...

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

    通过分析这些源码,我们可以深入理解如何在易语言环境中构建网络客户端,如何解析和构建Memcached协议的请求和响应,以及如何处理网络通信中的异常和错误。 这个模块可能包括以下几个关键部分: 1. 连接管理:建立...

    memcached是一个高性能的分布式的内存对象缓存系统[参照].pdf

    3. **即时通讯(IM)后台**:在即时通讯服务中,memcached可以用于存储用户状态、好友列表等信息,快速响应用户的查询请求,提升用户体验。 4. **分布式计算与存储**:除了作为缓存系统,memcached的分布式特性也...

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

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

    php上的memcache和memcached两个pecl库

    尽管如此,MySQL的通讯和数据处理比memcache复杂,mysqlnd能够实现libmysql无法做到的功能,例如直接使用PHP的内部数据结构存储缓冲区,以及优化持久连接的缓存策略。然而,这些仅是推测,没有深入研究mysqlnd的源码...

    用户通讯系统

    4. **缓存机制**:使用缓存(如Redis或Memcached)来减少数据库压力,提高响应速度。 5. **消息队列**:引入消息队列(如RabbitMQ或Kafka)可以异步处理大量消息,避免系统瓶颈。 6. **设计模式**:采用如工厂模式...

    言讯IM即时聊天通讯软件双端原生源码后端JAVA

    6. **分布式缓存**:Redis、Memcached等用于加速数据读取,减少数据库压力。 7. **推送服务**:如Firebase Cloud Messaging (FCM) 或Apple Push Notification service (APNs),实现实时的消息推送。 8. **实时统计...

    PHP实例开发源码-佳蓝即时通讯系统PHP源码 开源版.zip

    在本压缩包“PHP实例开发源码-佳蓝即时通讯系统PHP源码 开源版.zip”中,包含了一个基于PHP语言构建的即时通讯系统。这个开源项目为开发者提供...通过深入研究和分析,开发者可以提升自己的技能,并应用于实际项目中。

    及时通讯系统java版

    在实际开发过程中,开发者可能还会使用Spring框架来简化依赖管理和事务处理,使用WebSocket实现双向通信,使用MQTT或XMPP协议来优化消息传递,以及使用Redis或Memcached等缓存技术提高响应速度。 通过这个“及时...

    PHP开发的H5即时通讯聊天系统源码-带群聊-可封装APP

    9. **部署与扩展**:为了应对高并发和大规模用户,源码可能考虑了负载均衡、缓存策略(如Redis或Memcached)、数据库集群等技术,以提高系统的稳定性和可扩展性。 10. **测试与调试**:源码已经经过测试,表明...

    基于PHP的DuckChatPHP通讯系统(开源IM系统)源码.zip

    3. 缓存策略:通过缓存减轻数据库压力,提高响应速度,如Redis或Memcached。 4. 负载均衡:当用户量增大时,可考虑使用负载均衡技术分散服务器压力。 总结,DuckChatPHP通讯系统是一个基于PHP的开源IM解决方案,...

    Danga Socket

    综上所述,Danga Socket是构建高性能网络服务的理想选择,尤其在需要处理大量并发请求和依赖高效缓存系统如memcached的场景下,其异步通讯和优化的API设计都展现出了强大的优势。通过对Danga Socket的深入理解和应用...

    java即时通迅软件源码

    此外,为了提高性能和安全性,可能会使用缓存技术,如Redis或Memcached来存储频繁访问的数据。 2. 实时通信: 即时通讯的核心在于实现实时的消息传递。Java中的Socket编程可以用于创建客户端和服务器之间的连接,...

    亿级用户下的新浪微博平台架构1

    3.资源层主要是数据模型的存储,包含通用的缓存资源 Redis 和 Memcached,以及持久化数据库存储 MySQL、HBase,或者分布式文件系统 TFS 以及 Sina S3 服务。 垂直方向的技术架构主要包括接口框架 Web V4 框架,采用...

    Thinkphp6 redis队列 消息事件 gatewayworker聊天打通版

    接下来,`GatewayWorker`是一个专为实时通信设计的长连接服务框架,它支持TCP、UDP、WebSocket等多种协议,可以轻松实现大规模的即时通讯场景。在聊天系统中,`GatewayWorker`作为客户端和服务器之间的桥梁,处理...

    java版仿QQ即时通讯系统

    9. **缓存技术**:为了提高性能,开发者可能使用了缓存技术,如Redis或Memcached,来存储部分热数据,减少对数据库的访问。 10. **负载均衡与分布式**:随着用户量的增加,系统可能需要部署在多台服务器上,这就...

    【Java毕业设计】使用 Go 语言实现即时通讯系统,该系统聚集类似微信、QQ、陌陌等子系统。希望该项目对你熟悉Ja.zip

    例如,使用Nginx进行负载均衡,Redis或Memcached作为缓存,RabbitMQ或Kafka处理异步消息。 9. **测试与调试**:编写单元测试和集成测试是保证代码质量的重要环节,Go的`testing`包提供了测试框架。同时,学会使用Go...

Global site tag (gtag.js) - Google Analytics