2009-06-09 99 views
13

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

一个可能的参数是,如果对象从不删除,则缓存将无限增长,但memcached允许您指定最大大小。达到此大小后,memcached将使用最近最少使用的(LRU)算法来确定要删除的项目。总而言之,如果已经配置了一个明智的最大大小,并且所有写入都通过了缓存,那么为什么要在一定时间后过期对象呢?

谢谢, 唐

回答

0

我会说这是大约之间“最近最少使用”和区分“不会是使用了” ......如果你能明确指出哪些对象可以被取出来的缓存,这会留下更多空间用于稍后仍可能使用的对象。

+0

我读过的声明有时未过期的密钥实际上可能会在过期的密钥之前从缓存中删除 - 这是为了保持LRU缓存清除算法的有效性而作出的牺牲。换句话说,*不是'最近最少使用'和'不会再使用'之间的区别。到期的密钥在到期时并未实际移除 - 但是在下一次获取请求进入时它们将被清除。所以,简而言之,设置到期日并不一定有助于为未过期的密钥“留出更多空间”。 – 2010-01-22 23:06:34

14

当您不需要精确的信息时,过期时间非常有用,您只需要在特定时间内准确无误。所以你缓存你的数据(比如说)五分钟。当需要数据时,检查缓存。如果它在那里,请使用它。如果不是(因为它已过期),则重新计算该值。

某些缓存的值基于大量的数据,使缓存无效或向其写入新值是不切实际的。对于汇总数据或通过大量原始数据计算出的数据来说,情况通常如此。

3

一种情况是,某个值只在某段时间内有效。

+1

如前所述,总结我们在过去3小时内的网站流量或销售情况。将您的memcache过期时间设置为3小时,并在高速缓存中找不到时自动计算,并且您不必担心代码中的时间。或者它可能是一种临时密码或某种类型的标记。 (对象的好处,但我觉得它可以使用一些例子。) – 2012-03-30 23:02:04

3

缓存一些数据是昂贵的创建,但小的(应该持续很长一段时间),有些大,但价格相对便宜(应持续较短的时间)

而且,对于大多数应用来说是很难做出的memcached作为写入缓存工作。很难正确无效所有缓存,尤其是渲染页面的缓存。大多数用户会错过一对夫妇。

12

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

他们都表示,他们一般使用像3个小时的默认到期时间排序的“以防万一”。

  1. 对于大多数对象,这是不贵,重建他们每3小时
  2. 在你有一些导致事情停留缓存不应否则错误关的机会,这可以让你从陷入太多的麻烦

所以我想这个问题的答案是“为什么?”真的,“为什么不呢?”在那里过期并不会花费太多,它可能只会帮助确保您不会在缓存中保留陈旧的数据。

0

如果你的设计为直写式高速缓存调用,你仍然有来面对分配给memcached的内存限制这也正是LRU发挥作用的问题。

LRU确定踢出什么时,有两个规则,按以下顺序这样做:

  1. 过期砖
  2. 未使用旧板

提供了针对不同人群不同的到期日的对象可以帮助保持较不频繁访问的数据,这些数据在内存中缓存更加昂贵,同时允许使用更频繁使用的平板,这些平板仍然可以找到通往队列末尾的路径,但很容易重新创建并过期。

许多缓存键最终成为其他对象的集合也是这种情况,除非您为这些对象使用查找哈希值,否则让对象在几个小时后过期比主动更新所有对象容易得多关联的键,并且它还保留了您首先通过使用memcached来有效争夺的命中/失败比率。

0

有以下几个原因:

  1. 数据存储不在服务器重新启动之间持久的。重新启动或重新加载缓存服务器后,必须重新生成大量缓存数据。
  2. 可能有些情况下,当对象更新时没有通知您。例如。由API返回的用户详细信息。
  3. 搜索对象。 SQL提供了使用相同的数据来根据需求生成不同的结果,比如最近和最受欢迎的等等。您将不得不使用不同的缓存键来存储数据以获得不同的结果(数据重复,即使在单一通用数据更改)。此外,通过数据库服务器,您可以更灵活地浏览数据(自定义统计数据等)。
1

我们一直在思考同样的,这是什么是memcached的维基“即使你主动删除或覆盖缓存数据,你还是会希望有缓存过期偶尔为之。如果你的应用程序有一个错误,一个崩溃,一个网络blip或其他缓存可能不同步的问题。“

这很有意义,因为我们无法计划网络闪烁,并且如果我们每天或2周或每周发布代码就变得非常重要。我们有一个想法就是在每个发行版重新启动memcached服务器,但如果有10个或更多的memcached服务器,那将会非常痛苦。我相信最简单的事情就是设置对象的到期日期。