LRU 是否会删除一段时间未使用的条目



当内存中可用内存已满时,memcache 使用 LRU(最近最近使用)算法来释放内存。我的问题是 LRU 算法是否宁愿删除一段时间未使用的条目(最近最后一次使用)而不是过期项目?即将过期的条目不会在确切的时刻删除,而是在下次有人尝试访问它 (AFAIR) 时删除。那么LRU算法(也)会解释密钥的到期吗?

要了解 memcached 如何执行 LRU,您必须更深入地了解 memcached 如何存储项目。物品的存储取决于它们的大小,只需将所有物品(例如 100k)存储在同一个平板中,而其他 200k 的物品则存储在不同的平板中。

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

回到你的问题,当内存已满并且你尝试存储一个项目时,memcached 将首先在你尝试写入的平板中查找过期的项目,然后查找最少使用的项目。所以是的,它确实考虑了密钥的到期时间,或者更好的是,过期的密钥先在 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/

希望对您有所帮助!

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

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

Memcache 将根据 LRU 逐出项目(只要它有任何过期的项目,只要它们比另一个密钥最近使用(甚至有效))并不重要)。

不久前在Memcache 1.4.4上测试过。

最新更新