Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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 Rails—如何缓存数据以供服务器使用,为多个用户提供服务_Ruby On Rails_Ruby_Ruby On Rails 4 - Fatal编程技术网

Ruby on rails Rails—如何缓存数据以供服务器使用,为多个用户提供服务

Ruby on rails Rails—如何缓存数据以供服务器使用,为多个用户提供服务,ruby-on-rails,ruby,ruby-on-rails-4,Ruby On Rails,Ruby,Ruby On Rails 4,我有一个类方法(放在/app/lib/中),它执行一些繁重的计算和子http请求,直到收到结果 结果不是太动态,多个用户访问应用程序中的特定视图时会请求该结果 因此,我希望安排该方法的定期运行(使用cron和where-gem),使用JSON格式将结果存储在服务器的某个位置,并根据需要将结果单独读取到视图中 如何做到这一点?正确的方法是什么 我目前拥有的: def heavyMethod response = {} # some calculations, eventually bu

我有一个类方法(放在
/app/lib/
中),它执行一些繁重的计算和子http请求,直到收到结果

结果不是太动态,多个用户访问应用程序中的特定视图时会请求该结果

因此,我希望安排该方法的定期运行(使用cron和where-gem),使用JSON格式将结果存储在服务器的某个位置,并根据需要将结果单独读取到视图中

如何做到这一点?正确的方法是什么

我目前拥有的:

def heavyMethod
   response = {}
   # some calculations, eventually building the response
   File.open(File.expand_path('../../../tmp/cache/tests_queue.json', __FILE__), "w") do |f|
      f.write(response.to_json)
   end
end
以及读取此文件的相应方法

我搜索了与ActiveRecord无关的数据,但没有找到使用Rails缓存约定(而不是我编写的一些私有代码)实现这一点的示例


谢谢

您的解决方案应该可以正常工作,但是使用
Rails.cache
应该更干净、更快。提供有关
Rails.cache
以及如何使其与
memcached
一起工作的足够信息,让我总结一下在您的案例中如何使用它

重型方法

def heavyMethod
   response = {}
   # some calculations, eventually building the response
   Rails.cache.write("heavy_method_response", response)
end
请求

response = Rails.cache.fetch("heavy_method_response")
这里唯一的问题是,当您的服务器第一次启动时,缓存将是空的。如果/当memcache重新启动时也是如此

一个优点是,在流的某个地方,u传入的数据被编组到存储中,然后在退出时取消参与。这意味着u可以传入复杂的数据结构,并且不需要手动序列化为json

编辑:如果项目内存不足,memcached将清除该项目。这将是非常罕见的,因为它使用LRU(我认为)算法使事情过期,我想你会经常使用它。 为防止此,

  • expires\u设置为大于您的cron周期
  • 如果您的获取失败(如
    Rails.cache.fetch(“heavy\u method\u response”){heavy\u method}
    ,请更改获取代码以调用
    heavy\u方法
    ,并更改
    heavy\u方法以仅返回对象
  • 使用类似于
    redis
    的工具,它不会删除项目

  • rails cache-memcached.
    cache.set
    在您的定期作业中,以及
    cache.get
    在您的请求中。您需要注意冷启动时会发生什么。您可能希望在服务器启动时运行该进程,或者您可以这样做,以便在条目丢失时视图会运行该进程。但这对体验不利提供许多缓存方法ds,您也可以使用redis或memcache来保存json数据,读取文件可能会更快。@KarthikT,非常感谢这两个答案。事实上,我希望没有任何用户会体验到该方法的加载时间。例如,我希望每15分钟执行一次后台作业,缓存它,并获取缓存的数据结果在我的rails视图中。另外,对于冷启动,在服务器启动时运行似乎确实是一个更好的主意(使用rake任务或从实例初始值设定项调用该方法)。您可以发布一个关于如何使用memcached方法实现这一点的答案吗?感谢这个答案!只是为了确保-(1)再次调用此方法将使用更新的信息刷新存储缓存?(2)
    fetch
    方法是否有可能失败?或者,一旦此方法在服务器启动时运行,主信息将一直存在,直到服务器关闭?谢谢,如果memcached关闭,或者如果您不使用memcached,无论您使用什么缓存,它都将失败。不要使用默认内存存储,因为它是每个进程的本地存储,因此n我是否确保我存储的最新值不会从缓存中删除,而只能替换为新的、定期计算的更新值?(我看到在
    参数中有一个
    expires\u,但将其设置为类似于
    1.year
    的值似乎是错误的方式…啊,嗯,忘记了那个位。memcached将在项目内存不足时删除它。
    expires\u in
    的cron持续时间应该足够了。或者,如果您愿意使用重载方法万一发生这种情况,您可以在块内执行此操作,以
    获取
    ,否则,请使用redis之类的工具,我认为它更适用于无法像这样擦除的数据。