【问题标题】:Rails using ActiveSupport::Cache::MemoryStore to save variable between two api calls (controller methods)Rails 使用 ActiveSupport::Cache::MemoryStore 在两个 api 调用之间保存变量(控制器方法)
【发布时间】:2018-12-13 23:56:58
【问题描述】:

我有一些 API,我想在其中保存一些可以在每个 API 方法之间访问的值,因此我尝试使用 ActiveSupport::Cache::MemoryStore。我可能没有正确使用 MemoryStore(从未使用过,找不到具体的教程)

我是否正确使用 MemoryStore?看起来应该超级简单,但似乎无法保存任何价值。

class MyController
  # 1st API handler /post
  def first
    @cache = ActiveSupport::Cache::MemoryStore.new() if @cache.nil?
    @cache.write('shared_val', params['user_key'])
  end

  # 2nd API handler /post
  def second
    @cache = ActiveSupport::Cache::MemoryStore.new() if @cache.nil?
    saved_val = @cache.read('shared_val')
    puts "#{saved_val}"  # nil?????
  end

我还尝试了一些我在 SO 答案中看到的示例,但似乎仍然无法保存价值。

  # In config file
  config.cache_store = :memory_store

  # 1st API handler /post
  def first
    Rails.cache.write("ABC", "abc")
    check_val = Rails.cache.read('ABC')
    puts "VALUE: #{check_val}"  # shows correct 'abc'
  end

  # 2nd API handler /post
  def second
    Rails.cache.fetch("ABC")  # gets nil, why???
    Rails.cache.read("ABC)    # also nil
  end

【问题讨论】:

  • 您使用的是什么网络服务器?内存存储仅在单个进程内共享数据。根据文档,如果您在集群模式下使用 Puma,或 Phusion Passenger,或任何其他多进程或多服务器 Web 服务器,那么您的第二个请求可能无法访问相同的缓存。此外,fetch 是一种用于读取或写入的缓存方法。它使用您作为 arg 传递的密钥进行读取,如果读取失败,则需要一个块来写回缓存。它用于延迟缓存。您可能需要改用 redis 或 memcached 存储。你的第二个例子看起来更像我期望的工作。
  • github.com/rails/rails/blob/… 顺便说一句,这是我在文档中读到的。
  • Nate,我只是在开发环境中使用 puma 运行它。 puma web_concurrency 设置已被注释,我还尝试将最大线程数设置为 1。调用 2nd API 时仍然为零。
  • guides.rubyonrails.org/caching_with_rails.html#basic-caching 如果你设置config.action_controller.perform_caching = true 会怎样?
  • YES!!!!!!!!!,抱歉我懒得检查整个 development.rb 文件并且 else 块禁用了我的设置。谢谢!!!你能发布你的答案,我会接受。我很确定它可能会帮助某人,因为我已经多次搜索答案。

标签: ruby-on-rails ruby memcached


【解决方案1】:

config.action_controller.perform_caching 默认为 false。您需要在其他环境中打开它。

【讨论】:

    猜你喜欢
    • 2012-10-07
    • 2017-10-08
    • 1970-01-01
    • 2011-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多