1. memcache的是采用Slab Allocation的机制分配和管理内存的。其基本原理就是按照预先规定的大小,将分配的内存分割成特定长度的块,用以解决内存碎片问题。但由此也引来了内存浪费的问题。
2. Slab Allocation将分配的内存分割成各种尺寸的块(chunk),并把尺寸相同的chunk分成chunks组。如下图所示。
3. memcache分配的内存不会回收,会被重复利用。
4. Slab Allocation术语:
Page:
分配给slab的内存空间,默认是1M,分配给slab之后根据slab的大小切分成chunk。
Chunk:
用于缓存记录的内存空间。
Slab Class:
特定大小的chunk组。
5. Slab中缓存记录的原理
memcache会根据接收的客户端的数据的大小,选择最适合数据大小的slab。memcache中保存着slab中的空闲chunk的列表,根据该列表选择chunk,将数据缓存其中。如下图所示:
6.Slab Allocation机制的缺点:
由于内存的分配是按特定长度进行分配的,所以无法有效利用内存。例如100B的数据只能缓存到128B的chunk中,剩余的28B就浪费了。如下图所示:
目前还没有完美的解决方案。但是如果预先知道数据的公用大小或者存储相同大小的数据,就可以预先定义适合大小的chunk组,减少内存浪费。
另外,
1. memcache删除数据的原理是采用LRU算法,可以通过-M 命令参数禁止LRU。
2. memcache不会释放已经申请的内存,而是对内存进行复用。
3. memcached内部不会监视记录是否过期,而是在get时查看记录的时间戳,因此,memcached不会在过期监视上耗费CPU时间,被称为Lazy expiration。
4. memcache文本协议下,key的最大长度是250字节;二进制协议下,理论是2e16即65536字节。