IT技术博客大学习 共学习 共进步

Memcache源代码分析之数据存储

IM鑫爷 2011-09-19 23:58:35 浏览 4,863 次

    \"\"

    其它先不说,直接上张图,为什么呢,看图说话,哈哈。。入主题,上篇我们讲到网络处理,这次讲讲数据存储,从上面图上基本可以看到处理流程,不过忽略了一些细节,但里面有两个地方要值得说一下,在图上也做了标注,就是图中的1和2,分别是内存分配和hashtable管理,

    1、内存分配,当一条命令的参数解析完之后,就要为之分配其内存空间,要分配的空间大小=key长度+1+后缀长度+内容长度,这里的后缀长度其实是压缩参数和内容长度的ascii所占的字符个数(具体请查看items.c的第81行),得知需要的内存长度之后就得从内存块中去查找空闲的内存,这就是所谓的内存池(什么是内存池技术,本blog里面也有写到),如何查找空闲的内存呢,首先从内存块的中找一块能放下该数据的块(内存块是一个数组,每个元素存放了该块的大小和由多块内存组成的链表),然后从内存块的块链表末尾开始向前循环查找,直到找到一个空闲的块(在这个查询过程中有一个前提就是,如果循环了50次还没找到数据,则视为没有空闲块),如果没有找到空闲的内存块,就重新分配一大块内存,然后挂到这个块链表上。

    2、hashtable管理,当数据数量超过表大小的1.5倍,那么memcache会新申请一块原始表2倍的内存作为新表,然后启动一个线程将原来的数据重新hash(key)分配到新的表上;

    以上就是简单的数据存储过程,太多细节的东西没有写进去,大家空了也可以去研究研究memcache的源代码。有错误的地方记得提出来。

建议继续学习

  1. 关于memcache分布式一致性hash (阅读 11,661)
  2. Memcache分布式部署方案 (阅读 6,667)
  3. 关于session和memcache的若干问题 (阅读 5,186)
  4. Memcache mutex设计模式 (阅读 4,904)
  5. 解决memcache连接奇慢问题一例 (阅读 4,747)
  6. Memcache协议的学习 (阅读 4,704)
  7. 关于Memcache长连接自动重连的问题 (阅读 4,641)
  8. Memcache源代码分析之网络处理 (阅读 4,543)
  9. memcache的几点注意 (阅读 4,203)
  10. memcache连接慢又一例 (阅读 4,044)