13

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

4

2 回答 2

37

要了解 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/

希望能帮助到你!

于 2012-04-13T10:43:52.840 回答
0

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

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

Memcache 将根据 LRU 驱逐项目(它是否有任何过期项目都没有关系,只要它们比另一个键最近使用(甚至有效))。

不久前在 Memcache 1.4.4 上测试过。

于 2014-02-14T13:35:49.643 回答