Ruby on rails 服务器端映像缓存
我们的webapp将执行API调用以检索图像。这些图片可以缓存一段合理的时间,如条款中所述,因此我们不必在每次页面请求时都访问其他网站的服务器 我不熟悉缓存,但我只是看了一些Railscasts关于一些不同方法的介绍<代码>页面缓存,Ruby on rails 服务器端映像缓存,ruby-on-rails,api,caching,ruby-on-rails-4,Ruby On Rails,Api,Caching,Ruby On Rails 4,我们的webapp将执行API调用以检索图像。这些图片可以缓存一段合理的时间,如条款中所述,因此我们不必在每次页面请求时都访问其他网站的服务器 我不熟悉缓存,但我只是看了一些Railscasts关于一些不同方法的介绍页面缓存,片段缓存,动态页面缓存。它们都有助于减少请求,从而提高我的应用程序的速度 但是,如何在服务器上“缓存”来自另一个站点的图像呢?正确的方法是什么?是否有任何功能可用于此目的 我的尝试 将在我的图像模型中添加一个时间戳,cache\u outdates\u at,并将其设置为一
片段缓存
,动态页面缓存
。它们都有助于减少请求,从而提高我的应用程序的速度
但是,如何在服务器上“缓存”来自另一个站点的图像呢?正确的方法是什么?是否有任何功能可用于此目的
我的尝试
将在我的图像
模型中添加一个时间戳,cache\u outdates\u at
,并将其设置为一个月后。每当图像再次加载时,它都会更新时间戳
然后,我会添加一个cronjob来检查过时的图像,然后删除它们。我建议您不要用代码将Rails应用程序弄得乱七八糟,以缓存异地资产。相反,使用为作业构建的HTTP代理,例如Squid。看看这个缓存非现场视频的工具 因此,你的webapp只需要重写url,比如说,将
cache.example.com
,或者缓存服务器的主机名添加到它生成的url中。设置一个通配符DNS条目,以便*.cache.example.com
都指向您的Squid服务器。Squid可以配置为重写域、获取远程资产并为其提供服务
所有的缓存管理,包括过时项目的弹出,都将由Squid自动为您处理。作为奖励,性能可能比Rails上的要好。问得好。如果你把问题放在盒子外面看,这是相当容易的 当您检索第三方服务器映像时,只需复制该映像并将其放入您的服务器或CDN中。而且,使用它。为此,您必须设置一些方法,例如
# app/model/image.rb
def image_link(name_of_image)
if File.exist? "/some/#{name_of_image}.jpg"
path = "/some/#{name_of_image}.jpg"
else
external_image_link = external_api_call(name_of_image)
DownloadImageWorker.perform_async(external_image_link) // perform it asynchronously
external_image_link
end
我可以和大家分享我自己缓存外部图像的方法。另外,当我解决这样的任务时,我需要在底层外部图像更新时更新我这边的图像 外部服务使用电子标签对图像进行签名,所以我下一步将使用此功能 我有
Photo
模型,它存储external\u url
和etag
,还有一些关于图像的信息(在我的例子中,载波的图像名称)
所以,我从一些API收到了image\uURL
,我想把这个图像上传到我的服务器上,不想加载外部服务器
photo = Photo.find_or_initialize_by(external_url: image_url)
img_responce = Faraday.get do |req|
req.url image_url
if photo.etag
req.headers['If-None-Match'] = photo.etag
end
end
case img_responce.status
when 200
# This mean, image changes (or new)
photo.update external_url: image_url,
etag: img_responce.headers['etag'],
image: StringIO.new(img_responce.body)
when 304
# This mean, image doesn't change
end
很好的建议,亚历克斯,我必须看一看。我想知道的一件事是,是否有可能在服务之前调整资产的大小。我们提供2-3个比原版小得多的版本。据我所知,他想缓存图像。因此,根据您的建议,图像将被复制并永久保留。一年?两年?10?不,我没有说任何与这个话题相关的话。这部分放在
DownloadImageWorker
worker中,他可以根据自己的需要设置逻辑。感谢概述:)帮助我学习了sidekiq
等内容,我会让你们知道我做得如何。太好了sidekiq
非常棒。我喜欢它。它以非常优雅的方式完成所有事情。谢谢Mik,这似乎对更新旧图像非常有效,但是你也会删除这些图像吗?这个解决方案也没有利用CDN。当然,如果你收到404状态-这意味着图像已被删除,你可以适当地处理它。而不是存储您可以上传到CDN的图像-这只是细节。