【问题标题】:Rails.cache.read not returning new value when changed during requestRails.cache.read 在请求期间更改时不返回新值
【发布时间】:2019-12-28 02:01:00
【问题描述】:

在 Web 请求期间,我发现如果在请求期间被另一个进程(例如另一个 Web 请求或 Rails 控制台)修改,随后对 Rails.cache.read 的调用不会反映最新值。我可以使用 WEBrick 使用普通 Rails 应用程序复制该问题,默认 ActiveSupport::Cache::FileStore 如下:

class WelcomeController < ApplicationController

  def index
    logger = Logger.new Rails.root.join('output.log')
    logger.info Rails.cache.read('foo')
    sleep 5
    logger.info Rails.cache.read('foo')
  end

end

假设foo 键的起始值为alice。在 sleep 的 5 秒内,如果我在 Rails 控制台中运行 Rails.cache.write 'foo', 'bob',我希望记录以下内容:

I, [2019-08-22T18:05:04.551440 #48742]  INFO -- : alice
I, [2019-08-22T18:05:09.551971 #48742]  INFO -- : bob

但结果却是:

I, [2019-08-22T18:05:04.551440 #48742]  INFO -- : alice
I, [2019-08-22T18:05:09.551971 #48742]  INFO -- : alice

在我刷新页面之前,似乎无法识别替换 foo 键数据的调用。请注意,这仅在作为 Web 请求运行时才会发生,而不是在从控制台调用相同代码时(例如使用 WelcomeController.new.index 调用)。

在我的实际项目中,我希望利用这种方法让 Web 请求等待另一个基于共享令牌的请求完成 - 但我对我的期望是否正确感到困惑。在项目本身中,puma 是 webserver,DalliStore 是 memory store,但是结果是一样的。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 caching memcached


    【解决方案1】:

    似乎正在发生的是ActiveSupport::Cache::FileStore 前置Strategy::LocalCache,后者又定义了一个机架中间件。这意味着每个机架请求只读取一次文件,并且该值存储在内存缓存中。除了以某种方式禁用该中间件之外,我没有看到避免这种情况的简单方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-10
      • 2021-03-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多