好吧,好吧,从表面上看,这似乎是个很糟糕的主意,而且大多数时候是这样的。它不是MVC,它创建了潜在的怪异依赖,而且它没有遵循良好的逻辑分离关注点。
现在让我解释一下导致我提出这个问题的情况。我们有一个第三方api。出于性能原因,我们必须将其缓存很长一段时间。有时他们会改变他们的数据,我们需要立即反映出来。我们已经给了他们一个api端点来清除缓存(因为出于各种原因,我们不会让他们访问我们的内部缓存)。我需要一些方法来重新加热缓存。重新升温他们的api调用很容易。但是,我们有依赖于这些数据的视图片段缓存,我也想对这些数据进行重温。
基本上,我想缓存通常在第二个控制器调用期间缓存的所有内容。但是,尝试这样做会导致第二个控制器调用超时。是否有一种方法来完成这一任务,或者有一种替代方法来缓存所有必需的元素(包括使用rails片段缓存的视图元素)?
发布于 2015-01-19 09:58:48
要解决Rails维护单个连接的问题,可以使用多线程方法:
Thread.new do
# do stuff here
end
发布于 2015-01-16 14:44:36
看来你真正的问题是破坏碎片缓存。为什么不直接使用一个自我破坏的缓存密钥。如果您使用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响应发送,并且您使用的是自破坏缓存密钥,那么您就不必担心手动“重新升温”缓存了。每当创建新的Post或更新新的post时,缓存键就会有所不同,因为count
和updated_at
(对于最近更新的post)将是不同的,并导致Rails.cache.fetch
方法执行块,重新升温缓存。
使用这种动态缓存键,您可以使用不需要调用控制器的任何方法来更新它(这非常困难,不建议使用)。
https://stackoverflow.com/questions/27993011
复制