LRU会删除在一段时间内没有使用过的条目吗?

时间:2012-04-12 11:11:39

标签: memcached lru

当在memcache中可用内存已满时,memcache使用LRU(最近最近使用的)算法来释放内存。 我的问题是LRU算法是否会删除在过期的项目中使用了一段时间(最近一次使用)的条目? 到期的条目不会在该确切时刻删除,而是在下次有人尝试访问时(AFAIR)。因此,LRU算法(也)会考虑密钥的到期吗?

2 个答案:

答案 0 :(得分:36)

要了解memcached如何处理LRU,您必须更深入地了解memcached如何存储项目。根据物品的大小存储物品,只需将所有物品(即100k)存放在同一块板中,而将200k的其他物品存放在不同的板块中。

当内存满了并且您尝试存储100k项目时,memcached将在该板上应用LRU。如果200k板中的键已过期或未使用,它们将保留在那里,而如果100k板只有热键,则基于该算法的其中一个将被驱逐。

回到你的问题,当内存已满且你试图存储一个项目时,memcached将首先查找你试图写入的slab中的过期项目,然后查找最少使用的项目。所以是的,它确实考虑了密钥的到期,或者更好的是,过期的密钥在LRU之前首先出现。

此外,当您尝试获取超过其截止日期的项目时,该项目将被逐出并回收内存。

更多详细信息(谷歌上有很多关于memcached内存分配的内容,这也解释了LRU,所以有很多内容可以阅读):

http://returnfoo.com/2012/02/memcached-memory-allocation-and-optimization-2/

http://www.adayinthelifeof.nl/2011/02/06/memcache-internals/

这是一个非常好的工具,我建议每个memcached主题:

http://code.google.com/p/phpmemcacheadmin/

希望它有所帮助!

答案 1 :(得分:0)

据我所知,这种说法不正确。

  

“回到你的问题,当内存已满且你试图存储一个项目时,memcached将首先查看你要写入的slab中的过期项目,然后寻找最少使用的项目。所以是的,它确实考虑了密钥的到期,或者更好的是,过期的密钥在LRU之前首先出现。“

Memcache将根据LRU逐出项目(如果它有任何过期的项目,只要它们最近使用的是其他密钥(甚至是有效的),则无关紧要。)

不久前在Memcache 1.4.4上测试过。