来源:自学PHP网 时间:2014-10-17 09:09 作者: 阅读:次
[导读] 1.关于本文档 本文档所有的分析都是在1.2版本之上,偶尔会提到比较1.1版本.其他版本没有阅读. 一个星期时间的 工作 ,不可能对memcache有很深刻的分析.文档本身的目的在于为以后的研究准...
1.关于本文档
本文档所有的分析都是在1.2版本之上,偶尔会提到比较1.1版本.其他版本没有阅读. 一个星期时间的工作,不可能对memcache有很深刻的分析.文档本身的目的在于为以后的研究准备一个总结资料.刚接触memcache时,对其设计分布式的思路感到十分欣喜,因为在中间层以极小的代价实现简单分布式无疑成为一些要求不是很高的分布式应用的一个很好的设计思路,这个特性决定memcache本身在分布式应用中,单个结点之间是Server相互独立,不会存在同级之间的通信.一个结点拒绝访问,如果没有相应的冗余策略,将导致该结点的数据丢失.同时,memcache的Server结点对数据的存储操作都是在内存中完成,而memcache对内存分配和回收采用了曾在SunOS实现的分页机制,预分配一个大内存(默认是 <= 200M),然后分页切块,对每个数据对象的存储便在所切的块中进行操作.这个特点决定memcache没有设计到任何磁盘IO操作,那么所有的关于memcache的性能瓶颈都在网络通信部分,而memcache正是将这一部分抛给了一个中间层完成.可以说真正的memcache是一个单进程,单线程,监听某个网络端口的daemon(或非daemon),是一个轻量级的应用服务进程.这些特性决定了memcache的应用范围,性能瓶颈和优化策略. 本文档的目的也就诣在探讨查看memcache源码后的一些观点. 文档分为六个部分: 1. 文档介绍.主要介绍文档组织和文档目的. 2. memcache的代码分析.分析memcache的源代码,指出核心的数据结构和算法. 3. memcache的使用优化.分析memcache的特点,结合实际应用给出一些优化memcache的策略. 4. memcache的测试分析.初略测试了memcache,给出优化方案的例证. 5. memcache的中间层客户端编写.分析memcache的通信协议,模拟编写了一个简单的memcache中间层客户端. 6. libevent简介.memcache采用的是libevent进行网络IO处理,libevent作为一种新的网络IO方式以高效的方法(epoll/kqueue)组织IO. 其中第六章可以不看.对于系统管理员,需要查看第一,三,四部分;进行二次开发的程序员可以查看第一,二,四,五,六部分. 2.memcache代码分析 1. memcache main流程 图2.1 memcache main流程 libevent的事件处理机制在main进程里体现在处理网络IO上.在TCP memcache的服务流程里,也是利用event处理事件的. 2. memcache服务流程(TCP) 图2.2 memcache服务流程图(TCP) 3. memcache状态转换和通信协议处理 图2.3 memcache状态转换和通信协议处理 需要说明的是,这里需要排除所有出错处理.很显然,不管是哪种操作下,一旦出错,信息需要通过conn_write状态往client写入出错信息的,那么在string_out时,必定转入conn_write状态. 而且,很多细节也没有在流程图中给出,如统计信息的处理,超时后get操作时删除等等.对于在memcache协议中定义的其他操作,如stats,version,quit,flush_all,own,disown等等由于使用很少,在流程中没有详细给出,可以查看源代码. 4. memcache核心数据结构 1. item结构 item是存储在memcache的key-value对的抽象.由于组织item存放是按照LRU算法组织的.那么在其中有几个成员在修改源代码时必须注意,time是最近访问时间.exptime是item消亡时间.item是一个双向列表.同时还挂在一个Hash table上.
|
自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习
京ICP备14009008号-1@版权所有www.zixuephp.com
网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com