好的,好的,从表面上看,这似乎是一个非常糟糕的主意,而且大部分时间都是如此。它不是MVC,它创建了潜在的奇怪依赖关系,并且它没有遵循良好的关注逻辑分离。
现在让我解释导致我提出这个问题的情况。我们有第三方api。出于性能原因,我们必须长时间缓存它。有时他们会更改数据,我们需要立即反映。我们已经给它们一个api端点来清除缓存(因为我们不会因为各种原因而让他们访问我们的内部缓存)。我需要一些方法来重温缓存。重温他们的api电话很容易。但是,我们有视图片段缓存依赖于该数据,我也希望对这些缓存进行复温。
基本上我想缓存在第二个控制器上调用期间通常会缓存的所有内容。但是,尝试此操作会导致第二个控制器调用超时。有没有办法实现这一点,或者是一种替代方法,它将导致所有必要的元素(包括使用rails片段缓存的视图元素)被缓存?
答案 0 :(得分:0)
看起来您的真正问题是破坏碎片缓存。为什么不使用自我破坏缓存键。如果您使用cache 'key' do...
缓存视图的某个部分,则“键”字符串可以由模型或诸如Post.count
之类的东西更新。例如,在API控制器中将帖子列表缓存为JSON列表:
# your api controller's index action
@post_json = Rails.cache.fetch "posts-#{Post.count}-#{Post.order(:updated_at).last.updated_at}" do
Post.all.to_json
end
现在您已经缓存了一系列帖子并准备作为API响应发送,并且您正在使用自我破坏缓存键,您不必担心手动“复位”缓存。每当创建新帖子或更新一个帖子时,缓存键都会有所不同,因为count
和updated_at
(对于最近更新的帖子)会有所不同并导致Rails.cache.fetch
方法执行块,重新启动缓存。
使用这种动态缓存键,您可以使用任何方法来更新它,而不需要调用控制器(这非常困难,不推荐)。
答案 1 :(得分:0)
为了解决Rails维护单个连接的问题,您可以使用多线程方法:
Thread.new do
# do stuff here
end