Memcached
实现原理
Memcached
将数据存放在内存中,有这么几个特点:
- 访问速度比传统关系型数据库要快
- 只要
Memcached
重启了,数据也就丢失了
Memcached
采用的内存分配方式是固定空间分配
Memcached
将内存空间分成一组slab
- 每个
slab
下有若干个page
,每个page
默认是1MB,如果一个slab
占用100MB内存的话,那么这个slab
下就有100个page
- 每个
page
里面包含一组chunk
,chunk
是真正存放数据的地方,同一个slab
里面的chunk
的大小是固定的 - 有相同大小的
chunk
的slab
被组织在一起,称为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个字节,但是避免了管理内存碎片的问题Memcached
的LRU
算法不是针对全局的,而是针对slab
的value
的大小不能大于1MB,因为page
只有1MB