`Memcached`解读

2016/3/15 posted in  others

Memcached实现原理

Memcached将数据存放在内存中,有这么几个特点:

  • 访问速度比传统关系型数据库要快
  • 只要Memcached重启了,数据也就丢失了

Memcached采用的内存分配方式是固定空间分配

  • Memcached将内存空间分成一组slab
  • 每个slab下有若干个page,每个page默认是1MB,如果一个slab占用100MB内存的话,那么这个slab下就有100个page
  • 每个page里面包含一组chunkchunk是真正存放数据的地方,同一个slab里面的chunk的大小是固定的
  • 有相同大小的chunkslab被组织在一起,称为slab_class

Memcached有新的value进来,它的存放位置是由value的大小决定的,value总是被存放到与chunk大小最接近的那个slab

slab的时候,首先slab要申请内存,申请内存是以page为单位的,所以在放入第一个数据的时候,无论大小为多少,都会有1MB大小的page被分配给该slab。申请到page后,slab会将这个page的内存按chunk的大小进行切分,这样就变成一个chunk数组。

相邻slab内的chunk基本以1.25为比例的增长

Memcached内存分配和回收算法,有三点要注意:

  • Memcached内存分配时,chunk里面会有内存浪费,88字节的value分配在128字节的chunk中,就损失了30个字节,但是避免了管理内存碎片的问题
  • MemcachedLRU算法不是针对全局的,而是针对slab
  • value的大小不能大于1MB,因为page只有1MB