memecache过期策略

惰性删除+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

转载于:https://my.oschina.net/u/3705388/blog/1618353

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值