惰性删除+LRU淘汰
memcache的LRU原理: 当某个单元被请求时,维护一个计数器,通过计数器来判断最近谁最少被使用。
注: 即使某个key 是设置的永久有效期,也一样会被踢出来!memcache使用slab allocator机制来内存管理。
slab allocator原理:先将内存划分为多个slab class仓库,每个仓库切分成不同尺寸的小块chunk。 需要存储内容时候,判断内容大小,为其选择合理的仓库。memcached 在启动时可以通过f选项指定Growth Factor 因子, 并在某种程度上控制slab 之间的差异.即各个chunk块的大小比例。
现在有114byte内存需要存放,首先memcache会检查chunk组,找到内容大于114byte且二则差的绝对值最小的那个chunk(假设是128)。如果此时128chunk已经用完,此时并不会去使用更大当的chunk,而是将chunk为128里面的旧数据踢掉,以备使用。
http://blog.csdn.net/hsd2012/article/details/51464847
一个Slab会有多个Page,一个page默认是1M,启动Memcached会预分配1M,当1M的数据满之后,如果有新数据进来,那么会重新分配一个Page给这个slab,但是Memcached是有内存上限的,如果不能申请Page的话,这时候就要针对这个Slab再利用LRU算法剔除掉最近最少使用的数据了。
1,Memcached的LRU算法针对每个Slab执行,而不是针对整体。
2,数据只会存在指定的Slab中,即使该Slab已经满了,而且更大的Slab有空间,这种情况会在指定的Slab执行LRU算法,因为数据不会被存放到更大的Slab中。
过期的数据如果没被显式调用get,也要占用空间。因为LRU是针对双向链表前面的数据,每个Slab由两个指针来维护该双向链表,即heads和tails指针,分别指向最老的数据和最新的数据。这就可能导致没有过期的数据被踢。
http://blog.csdn.net/qianshangding0708/article/details/47980697
Memcached的LRU几种策略
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