在哪里存储和缓存JSON?

use*_*339 5 json heroku

一直在考虑在Amazon Cloudfront上缓存我的JSON.

问题是,在更新JSON时手动清除该缓存可能需要15分钟.

有没有办法将简单的JSON值存储在类似CDN的http缓存中 -

  • 初始生成后不会触及应用程序服务器(heroku)
  • 允许我立即使缓存过期

更新

回应AdamKG的观点:

如果它正在"更新",则不是静态的:D编写新版本并告诉服务器使用新URL.

我的实际想法是每次html页面更改时缓存新的CloudFront URL.这是我最初的关注点.

我想要JSON的原因是存储最新CloudFront网址的版本号.这样我可以进行AJAX调用以发现要加载的版本,然后进行第二次AJAX调用以实际加载内容.这种方式我永远不需要使CloudFront内容过期,我只是重定向加载它的ajax.

但后来我有需要缓存JSON的问题.我不希望人们每次想要看到单个JSON版本号时都会击中Heroku发电机.我知道memcache和机架可以帮助我提高速度,但这是我不想要的问题.

我有一些想法:

  • 也许有一个第三方服务,类似于Memcache数据库,允许我在JSON网址中公开一个值?这样我的发电机永远不会被触及.
  • 也许有一个Cloudfront的替代方案,允许更快的手动过期?我知道这有点挫败了缓存的本质,但也许有更多的中间服务,比如清漆层或其他东西.

Ben*_*nns 4

一种方法是使用类似于 Rails 静态资产过期方式的资产过期方式。Rails 在文件名中添加了哈希签名,因此application.js类似于application-abcdef1234567890.js. 然后,每次用户请求您的页面时,如果 application.js 已更新,则脚本标记具有新地址。

\n\n

我设想你这样做的方式如下:

\n\n
User \xe2\x86\x92 CloudFront (CDN) \xe2\x86\x92 Your App (Origin)\n
Run Code Online (Sandbox Code Playgroud)\n\n

用户请求http://www.example.com/。该页面有元标记

\n\n
<meta content="1231231230" name="data-timestamp" />\n
Run Code Online (Sandbox Code Playgroud)\n\n

基于您上次更新 JSON 资源的时间。<%= Widget.order(updated_at: :desc).pluck(:updated_at).first.to_i %>如果您使用的是 Rails,这可能是由某些东西生成的。

\n\n

然后,在应用程序的 JavaScript 中,获取时间戳并将其用于 JSON url。

\n\n
var timestamp = $(\'meta[name=data-timestamp]\').attr(\'content\');\n$.get(\'http://cdn.example.com/data-\' + timestamp + \'.json\', function(data, textStatus, jqXHR) {\n  blah(data);\n});\n
Run Code Online (Sandbox Code Playgroud)\n\n

对 CloudFront 的第一个请求将到达位于 的原始服务器/data/data-1231231230.json,该请求可以永久生成并缓存。每次更新 JSON 时,用户都会获得一个新的 URL 来查询 CDN。

\n\n

更新

\n\n

由于您提到实际页面是您想要大量缓存的页面,因此您有几个选择。如果您确实希望 CloudFront 位于您的服务器前面,那么您唯一真正的选择是每次主页更新时发送失效请求。您每月可以免费失效 1,000 次,之后每 1,000 次收费 5 美元。此外,CloudFront 失效速度并不快,在页面更新之前仍然会有延迟。

\n\n

另一种选择是将您的内容缓存在 Memcached 中并从您的 dynos 提供服务。根据您询问的历史记录,我假设您正在使用 Ruby on Rails 或其他 Ruby 框架(但如果您没有使用,请澄清)。这需要安装Rack::Cache。Heroku 上的说明用于缓存资源,但这也适用于动态内容。接下来,您将使用 Rack::Cache 的invalidate接下来,每次更新页面时,是的,您的测功机将处理一些负载,但这将是一个简单的 Memcached 查找和响应。

\n\n

您的服务器布局如下所示:

\n\n

用户 \xe2\x86\x92 CloudFront (CDN) \xe2\x86\x92 Rack::Cache \xe2\x86\x92 cdn.example.com 上的应用程序 (Origin)\n用户 \xe2\x86\x92 Rack::Cache \xe2\x86\x92 您的应用程序(来源)在 www.example.com 上

\n\n

当您提供图像、CSS 和 JavaScript 等静态资产时,请使用 cdn.example.com 域。这将通过 CloudFront 路由请求,并且它们将被缓存很长时间。对您的应用程序的请求将直接发送到您的 Heroku dyno,并且可缓存部分将由 Rack::Cache 存储和检索。

\n