版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/successA/article/details/52490989
内存存储经常会面临一个问题,就是内存碎片化。
什么是内存碎片化呢?
在程序不断的申请和释放内存的过程中,会形成一些小的内存片段,无法利用。这种空闲,但是无法利用内存的现象,成为内存碎片化。
Memcached如何解决内存碎片化呢?
下面是Memcached的内存存储机制原理图。
首先把分配给Memcached的内存分割成数个slab仓库,各个仓库,切分成不同尺寸的小块,需要存内存时,判断内容的大小,并为其分配合理的仓库。
例如,如上图,1是88 bytes ,2是112bytes ,3是144bytes …… 100bytes就为它分配slab仓库2。
虽然这样的分配策略,会减少内存碎片化,但是如果形成了内存碎片化,空闲的空间也是不可再用的。
其中slab大小,可以通过生长因子进行控制。Grow factor默认是1.25倍,可以根据自己网站缓存的大小来调整比例因子。
删除机制
当Memcached数据过期后,怎么办?
1.当某个值过期后,并没有从内存中删除,通过stats统计,curr_item仍然有它的信息
2.当某个新值去占用它的位置时,当成chunk来占用
3.当get值时,先判断是否过期,如果过期,返回空,并清空;curr_item就减少。
虽然用户不能通过get查询到Memcached的过期数据,但是它并没有被真正删除,成为lazy expiration,惰性失效。
如果chunk满了,又有新的加入,旧数据会被踢掉。踢掉可以设置两种FIFO(先进先出)、LRU(最近最少使用)。
下面是一个LRU的demo: