【问题标题】:manually expire cache using Russian Doll使用俄罗斯娃娃手动过期缓存
【发布时间】:2013-03-13 01:46:52
【问题描述】:

我有一个用户可以保存很多搜索和很多任务。我正在使用以下内容缓存它们

- cache user do
  - user.tasks.each do |task|
    - cache task do
      # do something with task

- cache user do
  - user.saved_searches.each do |search|
    - cache search do
      # do something with search

我添加了通过touch 选项更新用户的选项,只要这些记录有任何更新。我想澄清的问题是这种情况:

我更新了一个搜索,它使该搜索的缓存过期,实际上是用户的缓存。由于用户的缓存已过期,user.tasks 将被执行。

有没有办法防止这种情况发生?

我正在考虑向cache user 添加一个密钥并手动使我在使用cache_digest gem 之前一直在做的缓存过期,但我不知道该怎么做。

【问题讨论】:

  • 查看我之前对一个非常相似的问题的回答。 stackoverflow.com/questions/15194270/…
  • 如果我没看错你的代码,user.tasks 仍然会被执行。而且,它总是会被执行,所以它是一个比当前代码更糟糕的选择。

标签: ruby-on-rails ruby-on-rails-4 russian-doll-caching


【解决方案1】:

您可以使用集合的最新 updated_at,而不是使用用户的缓存键来使集合过期,as the Rails Guide on caching 演示。例如

- cache("user-tasks/#{user.id}-#{user.tasks.maximum(:updated_at).try(:to_i)}") do
  - user.tasks.each do |task|
    - cache task do
      # do something with task

- cache("user-searches/#{user.id}-#{user.saved_searches.maximum(:updated_at).try(:to_i)}") do
  - user.saved_searches.each do |search|
    - cache search do
      # do something with search

【讨论】:

  • cache user一样,更新一个任务时user.tasks还是会执行
  • 是的,这可能就是你想要的 - 你问过当更新 search 时不执行 user.tasks,在这种情况下它不会。
  • 啊对。抱歉,这个问题已在 2 年前提出。尽管您所拥有的可能有效,但一个大问题是每次您点击该页面时它都会执行所有任务并保存搜索。
猜你喜欢
  • 1970-01-01
  • 2014-03-19
  • 1970-01-01
  • 2016-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多