下午好,
我在Heroku的应用程序中连接了Memcached。免费托管计划的限制是Memcached为5MB,Memcachier为25MB。作为几乎所有事物的新手,我只是希望澄清这代表什么。
我在配置文件中设置了DalliStore,并为Rack :: Cache设置了典型选项。我的Metastore在Memcache中,并且在文件系统上设置了权限存储。
问题:
Rack :: Cache和Memcache(通过Dalli商店)之间的细分/故事究竟是什么?它们是否有不同的用途?他们做同样的事吗?即以下代码是多余的
config.cache_store = :dalli_store
和
config.action_dispatch.rack_cache = {
:verbose => true,
:metastore => Dalli::Client.new,
:entitystore => 'file:tmp/cache/rack/body',
:allow_reload => false
}
答案 0 :(得分:9)
我一直在努力解决类似问题。
首先,让我们的术语直截了当。
Rails.cache
),可以将其配置为使用不同的Ruby软件实现。 config.cache_store
的一个设置是:memory_store
以使用内存中实现。另一个设置是:dalli_store
,它指定使用dalli gem,它在引擎盖下与你的memcached服务器建立了一个可能远程的连接。为了让Rack :: Cache在它们到达Rails堆栈和应用程序的其余部分之前处理请求,它必须在某处存储响应+元数据。它存储的位置由config.action_dispatch.rack_cache = { ... }
设置配置。
请注意,这是来自config.cache_store = :dalli_store
的不同的设置。他们没有必要相关。我认为这是很多混乱的地方。但实际上,我们可能希望它们都使用memcached,这意味着使用dalli实现。但是,它们每个都有自己的Dalli::Client
实例。 (另外,你的session_store可能是相关的,但不一定是。)
Heroku雪松堆有ephemeral file system,不能在dynos之间共享。但是,Heroku只为entitystore
提供了metastore
,而The MetaStore is responsible for storing meta information about a
request/response pair keyed by the request's URL.
The meta store keeps a list of request/response pairs for each canonical
request URL. A request/response pair is a two element Array of the form:
[request, response]
The +request+ element is a Hash of Rack environment keys. Only protocol
keys (i.e., those that start with "HTTP_") are stored. The +response+
element is a Hash of cached HTTP response headers for the paired request.
使用了memcached。
至于实际存储在Rack :: Cache Metastore中的内容,这些是recommend using tmp file storage with Rack::Cache类的文档:
heroku addons:open memcachier
因此,为了回答您的问题,HTTP请求标头和HTTP响应标头存储在Rack :: Cache Metastore中。另一方面,Rack :: Cache实体库存储整个响应主体(即HTML)。
从rack-cache v1.2 Rack::Cache::MetaStore
开始,这意味着您可能正在使用操作缓存和片段缓存。操作和片段缓存使用您的Rails缓存存储(而不是机架缓存)。但是如果你将它们都设置为物理上使用相同的memcached服务器,它们都会有助于内存使用。操作和部分缓存存储实际的HTML。
为了更深入地了解您的实际使用情况,如果您正在使用memcachier,请运行以下命令在浏览器中打开分析仪表板。
{{1}}
有关获取memcached统计信息的详细信息,请参阅you can't use page caching reliably on Heroku。
答案 1 :(得分:3)
嗯,这不容易回答。
首先,您可能不会在Heroku文件系统上存储任何内容,因为它不可写。因此,您应该将所有内容存储在Memcache中。因此,在免费计划中,您将存储5 / 25mb的数据,包括实体和元数据。
正如文档所说(对于Cedar堆栈):
每个dyno都有自己的短暂文件系统,并带有最近部署代码的全新副本。在其生命周期中,dyno可以将文件系统用作临时暂存器,但是其写入的文件对任何其他dyno(包括应用程序中的其他dyno)都不可见,并且在dyno停止或重新启动时,所写的任何文件都将被丢弃。 / p>
因此,使用文件系统似乎相当可行,特别是如果你使用的是单个dyno。
关于Rack :: Cache和Memcache之间的区别:Memcache是一个存储键/值对的服务器,在内存中有一些额外的好属性。 config.cache_store = :dalli_store
配置Rails.cache
,它是对可以使用的不同缓存机制的抽象。它是通用的,您可以将它用于任意键/值存储,操作和片段缓存。
另一方面,Rack :: Cache是Varnish的替代品,允许您缓存整个请求。