惰性删除+LRU淘汰php
memcache的LRU原理: 当某个单元被请求时,维护一个计数器,经过计数器来判断最近谁最少被使用。
注: 即便某个key 是设置的永久有效期,也同样会被踢出来! html
memcache使用slab allocator机制来内存管理。
slab allocator原理:先将内存划分为多个slab class仓库,每一个仓库切分红不一样尺寸的小块chunk。
须要存储内容时候,判断内容大小,为其选择合理的仓库。算法
memcached 在启动时能够经过f选项指定Growth Factor 因子, 并在某种程度上控制slab 之间的差别.即各个chunk块的大小比例。缓存
如今有114byte内存须要存放,首先memcache会检查chunk组,找到内容大于114byte且二则差的绝对值最小的那个chunk(假设是128)。若是此时128chunk已经用完,此时并不会去使用更大当的chunk,而是将chunk为128里面的旧数据踢掉,以备使用。memcached
http://blog.csdn.net/hsd2012/article/details/51464847spa
一个Slab会有多个Page,一个page默认是1M,启动Memcached会预分配1M,当1M的数据满以后,若是有新数据进来,那么会从新分配一个Page给这个slab,可是Memcached是有内存上限的,若是不能申请Page的话,这时候就要针对这个Slab再利用LRU算法剔除掉最近最少使用的数据了。.net
1,Memcached的LRU算法针对每一个Slab执行,而不是针对总体。 线程
2,数据只会存在指定的Slab中,即便该Slab已经满了,并且更大的Slab有空间,这种状况会在指定的Slab执行LRU算法,由于数据不会被存放到更大的Slab中。指针
过时的数据若是没被显式调用get,也要占用空间。由于LRU是针对双向链表前面的数据,每一个Slab由两个指针来维护该双向链表,即heads和tails指针,分别指向最老的数据和最新的数据。这就可能致使没有过时的数据被踢。htm
http://blog.csdn.net/qianshangding0708/article/details/47980697
1. 惰性删除。memcached通常不会主动去清除已通过期或者失效的缓存,当get请求一个item的时候,才会去检查item是否失效。
2. flush命令。flush命令会将全部的item设置为失效。
3. 建立的时候检查。Memcached会在建立ITEM的时候去LRU的链表尾部开始检查,是否有失效的ITEM,若是没有的话就从新建立。
4. LRU爬虫。memcached默认是关闭LRU爬虫的。LRU爬虫是一个单独的线程,会去清理失效的ITEM。
5. LRU淘汰。当缓存没有内存能够分配给新的元素的时候,memcached会从LRU链表的尾部开始淘汰一个ITEM,无论这个ITEM是否还在有效期都将会面临淘汰。LRU链表插入缓存ITEM的时候有前后顺序,因此淘汰一个ITEM也是从尾部进行 也就是先淘汰最先的ITEM。
**************** http://blog.csdn.net/initphp/article/details/44680115
https://www.cnblogs.com/space007/p/6114558.html