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