【问题标题】:How to use multiple caches in rails?如何在rails中使用多个缓存?
【发布时间】:2009-06-10 23:41:32
【问题描述】:

我有一个 Rails 应用程序,我想将 memcached 和文件存储缓存用于不同目的。

我想使用文件存储缓存来保留大量不经常更改的页面(有些根本不更改) - 即页面缓存 - 并将 memcached 用于其他所有内容(操作和数据库缓存等)。原因是存储在文件存储缓存中的页面可能需要大量存储空间,但个别大部分将不常被访问。

是否可以这样做,或者将 memcached 配置为缓存是否意味着它也用于页面缓存?

作为第二个问题,什么是以某种形式的 cron 作业从文件存储缓存中删除页面的安全方法,因为似乎没有为此缓存指定 ttl 的选项。例如,一个 UNIX 查找命令将快速查找并删除所有旧页面或长时间未访问的页面 - 考虑到应用服务器可能会尝试服务其中一个页面,这样做是否安全(虽然这不太可能)?如果没有,那么最好的方法是什么。

【问题讨论】:

  • 您对使用这两个缓存有什么想法吗?我也想这样做。不过,我们目前正在运行 Rails 2.0.2,我认为这会带来更多问题......
  • 是的,结合页面的文件存储缓存和其余部分的内存缓存(如果您完全配置 memcached)似乎可以(也是默认设置)

标签: ruby-on-rails caching


【解决方案1】:

如果您只想将文件系统用于页面缓存而将 memcached 用于操作和片段缓存,那没问题。页面缓存总是使用文件系统。请记住,页面缓存会绕过您的 Rails 应用程序,因此您不能将它用于包含在用户之间更改的内容的页面或使用过滤器进行访问控制的页面。

关于页面的删除,在 Unix 上,一个文件可以被删除,但直到所有打开的文件句柄都关闭后,它才真正从磁盘中删除。如果应用服务器已打开文件来处理请求,而 find 命令在一瞬间将其删除,则应用服务器在尝试读取时不会突然出错。

您还可以考虑让find 根据上次访问时间删除文件,而不是创建或修改文件,并在您的 Rails 应用程序中使用清扫器在其内容过期时删除缓存页面。

【讨论】:

    【解决方案2】:

    更简单的方法可能是使用应用程序上游的 http 缓存作为页面缓存,而不是在 rails 中使用两个存储。这样,您可以使用 http 标头来控制缓存行为,包括 TTL。这些相同的限制也适用于浏览器的本地缓存,作为一个不错的奖励。

    Varnish 的性能与它的性能差不多,但需要在您的托管环境中设置另一个移动部件作为代理。这可能仍然值得,具体取决于您在做什么。

    Rack::Cache 可能是一种更简单的方法,如果您使用的是支持机架的 rails 版本,它将很容易设置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-27
      • 1970-01-01
      • 2014-02-20
      • 1970-01-01
      • 2019-10-13
      • 2016-09-18
      • 2016-02-28
      • 2011-04-05
      相关资源
      最近更新 更多