IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

Memcache源代码分析之数据存储

IM鑫爷 2011-09-19 23:58:35 累计浏览 4,984 次
本机暂存

    \"\"

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

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

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

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

同分类推荐文章

  1. 等了十年的 Go 链式管道,终于来了:seq 让你像写 Scala 一样写 Go (2026-06-25 18:38:18)
  2. Go 实验特性详解 (2026-06-21 10:05:27)
  3. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)

查看更多 后端 文章 →

建议继续学习

  1. WordPress插件开发 -- 在插件使用数据库存储数据 (累计阅读 29,164)
  2. Java开发岗位面试题归类汇总 (累计阅读 22,155)
  3. Linux内存点滴 用户进程内存空间 (累计阅读 13,228)
  4. Linux Used内存到底哪里去了? (累计阅读 11,866)
  5. Linux操作系统的内存使用方法详细解析 (累计阅读 10,149)
  6. 几个内存相关面试题(c/c++) (累计阅读 9,443)
  7. top 命令补充 ( VIRT RES SHR) (累计阅读 9,115)
  8. 基于SSD的数据库性能优化 (累计阅读 8,843)
  9. 腾讯分析系统架构解析 (累计阅读 7,769)
  10. Innodb分表太多或者表分区太多,会导致内存耗尽而宕机 (累计阅读 7,717)