Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 服务器端映像缓存_Ruby On Rails_Api_Caching_Ruby On Rails 4 - Fatal编程技术网

Ruby on rails 服务器端映像缓存

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,并将其设置为一

我们的webapp将执行API调用以检索图像。这些图片可以缓存一段合理的时间,如条款中所述,因此我们不必在每次页面请求时都访问其他网站的服务器

我不熟悉缓存,但我只是看了一些Railscasts关于一些不同方法的介绍<代码>页面缓存,
片段缓存
动态页面缓存
。它们都有助于减少请求,从而提高我的应用程序的速度

但是,如何在服务器上“缓存”来自另一个站点的图像呢?正确的方法是什么?是否有任何功能可用于此目的

我的尝试 将在我的
图像
模型中添加一个时间戳,
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的图像-这只是细节。