【发布时间】: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