Memcached--内存存储机制,LRU删除机制

版权声明:本文为博主原创文章,未经博主允许不得转载。 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:





猜你喜欢

转载自blog.csdn.net/successA/article/details/52490989