Memcached的数据存储方式被称为Slab Allocator,其基本方式是:
1:先把内存分成很多个Slab,这个大小是预先规定好的,以解决内存碎片的问题。启动参数的时候配置进去的不懂得可以参考memcached启动参数配置章节。
分配给Slab的内存空间被称为Page,默认是1M。一个Slab下可以有多个Page。
2:然后把一个Page分成很多个chunk块,chunk块是用于缓存记录的空间。Chunk的
大小是先有一个基本值,然后根据增长因子来增大。每一个page中chunk是相等的空间大小。
3:slab class:内存区类别(48byte-1M),每个类别有一个slab classId,图左边的,类似索引方便管理记录。
4:Memcached里面保存着slab内空闲的chunk列表,当收到要保存的item的时候,它
会根据item的大小,去选择一个最合适的slab,然后找到空闲的chunk,把数据存放进去。
比如我们存放120字节的值,有个chunk值为100还有一个chunk是130,存到100的chunk是没有足够空间存储的,存储到130这个chunk是可以的,最近的原则存储。但是存储到130chunk里面,也有一个问题就是浪费了10字节内存。所以合理的分配空间也是很重要的。
启动的时候添加参数:-vv注意小写的不是大写的。
./memcached -d -m 10 -u root -l 0.0.0.0 -p 18887-c 256 -P /tmp/memcached.pid -vv
如下图所示:
上面的图也印证了前面说的原理。确实是这样分配的。