memcached到期时间

时间:2009-06-09 02:16:15

标签: language-agnostic caching memcached

Memcached提供缓存过期时间选项,该选项指定对象在缓存中保留的时间。 假设所有写入都是通过缓存,我无法理解为什么人们会想要从缓存中删除对象。换句话说,如果所有写操作都在DB之前更新缓存,那么缓存永远不会包含陈旧对象,那么为什么要删除它呢?

一个可能的论点是,如果永远不删除对象,缓存将无限增长,但memcached允许您指定最大大小。达到此大小后,memcached将使用最近最少使用(LRU)算法来确定要删除的项目。总而言之,如果配置了合理的最大大小,并且所有写入都是通过缓存进行的,那么为什么要在一段时间后使对象失效?

谢谢, 唐

8 个答案:

答案 0 :(得分:14)

当您不需要精确信息时,到期时间很有用,您只希望它在一定时间内准确无误。因此,您将数据缓存(比方说)五分钟。需要数据时,请检查缓存。如果它在那里,使用它。如果不是(因为它已过期),那么去重新计算该值。

某些缓存值基于大量数据,无效缓存或向其写入新值是不切实际的。这通常适用于摘要数据或从大量原始数据计算的数据。

答案 1 :(得分:12)

当我第一次开始使用memcached时,我自己很好奇。我们问过在hi5和facebook工作过的朋友(两个都是memcached的重度用户)。

他们都说他们通常使用3小时的默认过期时间作为“以防万一”。

  1. 对于大多数物品,每3小时重建一次并不昂贵
  2. 关闭机会你有一些错误导致事情保持缓存,否则,这可能会让你不会遇到太多麻烦
  3. 所以我想问“为什么?”这个问题的答案。真的,“为什么不呢?”。在那里过期并不会花费太多,而且它可能只会帮助确保您不会将过时的数据保留在缓存中。

答案 2 :(得分:3)

一种情况是价值仅在一段时间内有效。

答案 3 :(得分:3)

缓存中的一些数据创建成本很高但很小(应该持续很长时间)而有些数据很大但相对便宜(应该持续的时间较短)

此外,对于大多数应用程序来说,很难将memcached工作作为直写缓存。很难正确地使所有缓存无效,尤其是渲染页面的缓存。大多数用户都会想念一对。

答案 4 :(得分:1)

我们一直在考虑相同的问题,这就是memcached wiki上的内容“即使您主动删除或覆盖缓存数据,您仍然希望缓存偶尔过期。如果您的应用有错误,崩溃,网络故障或其他一些缓存可能变得不同步的问题。“

这是有道理的,因为我们无法计划网络流量,如果我们每天或每周或每周发布代码就变得很重要。我们有一个想法是每个版本重新启动memcached服务器,但如果有10个或更多的memcached服务器,这将非常痛苦。我认为最简单的事情是设置对象的到期时间。

答案 5 :(得分:0)

我会说它是关于'最近最少使用'和'不再使用'之间的区别...如果你可以明确地指出哪些对象可以从缓存中取出,那就为对象留下了更多的空间可能仍会在以后使用。

答案 6 :(得分:0)

如果你的设计需要一个直写缓存,你仍然遇到一个问题就是遇到分配给memcached的内存限制,这是LRU发挥作用的地方。

LRU在确定要踢出的内容时有两条规则,并按以下顺序执行:

  1. 过期的石板
  2. 最旧的未使用的板坯
  3. 为不同的对象组提供不同的到期日期可以帮助保持较少访问的数据,这些数据在内存中缓存更加昂贵,同时允许更频繁使用的板块,这些板块可能仍然可以找到队列的末尾,但很容易重新创建,到期。

    同样的情况是,许多缓存键最终成为其他对象的聚合,除非您对这些对象使用查找哈希,否则让对象在几个小时后过期比主动更新所有对象要容易得多相关的键,它还可以通过首先使用memcached保留您有效竞争的命中/未命中率。

答案 7 :(得分:0)

有几个原因:

  1. 数据存储在服务器重新启动之间不是持久的。重新启动或重新加载缓存服务器后,必须重新生成大型缓存数据。
  2. 可能存在更新对象时未收到通知的情况。例如。 API返回的用户详细信息。
  3. 搜索对象。 SQL提供了使用相同的数据来生成不同的结果,这取决于最近和最多投票等的要求。您将不得不使用不同的缓存键来存储数据以获得这些不同的结果(数据复制,即使是单一的共同基准变化)。此外,使用数据库服务器,您可以更轻松地浏览数据(自定义统计信息等)。