当内存中可用内存已满时,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上测试过。