代码之家  ›  专栏  ›  技术社区  ›  dan

如何更新片段缓存,同时允许在更新过程中读取缓存?

  •  0
  • dan  · 技术社区  · 15 年前

    是否有一种方法可以刷新片段缓存,以允许在更新时从缓存中读取?

    cache do .. end

    我正在终止控制器中的同一缓存,并调用 expire_fragment(:controller => 'controllername')

    我使用memcached作为片段缓存存储。

    expire_fragment 该片段将从缓存中删除,因此在该请求之后的一瞬间,针对同一片段的另一个请求将错过缓存。

    我真正希望的是,在计算新片段并将其保存在缓存中之前,从缓存中进行读取,在这一点上,所有后续请求都会获得新的缓存版本。

    这个特定片段的计算成本很高。大约需要7秒钟。

    2 回复  |  直到 15 年前
        1
  •  0
  •   Toby Hede    15 年前

    我假设memcached有一些处理读写冲突的机制。

    这个问题只会在流量非常高的站点上发生。

    编辑: 在 memcached FAQ

    发送到的所有单个命令 memcached是绝对原子的。如果 针对同一对象,它们不会 序列化,并将执行一个 模式下,所有命令都是原子的。如果他们 不是,这是一个错误:)

    我认为你所描述的问题不会有多大问题。在不深入讨论Rails内部结构的情况下,在多vm Rails环境中仍然有可能出现缓存未命中,但最糟糕的情况是,片段是由恰好具有正确计时的请求生成的。除非您的碎片非常昂贵(几秒钟而不是几毫秒),并且您的流量和基础设施非常庞大(多个rails实例,每秒数百个请求),否则我怀疑这将是一个问题。

        2
  •  0
  •   Larry K    15 年前

    使用版本号作为缓存密钥的一部分。这可以通过片段缓存或memcache来完成。

    步骤:

    1. 将“缓存版本”添加到相应的模型中
    2. 要更新缓存,请执行以下操作:
      1. 更新模型的缓存版本。-下次请求传入时,控制器将查找缓存版本并使用新值,然后返回新结果
      2. 不要忘记在某个时候刷新旧的缓存值。也许每晚。。。。

    如果需要,缓存版本可以存储在mem\u cache中,而不是数据库中。