【问题标题】:Rails caching: Expiring multiple pages for one actionRails缓存:一个操作使多个页面过期
【发布时间】:2012-05-26 19:12:19
【问题描述】:

我已经在我的应用程序中设置了动作缓存(使用清扫器,但我想这在这里无关紧要),到目前为止它工作得很好,除了一件事:

我使用 Kaminari 进行分页,因此当我对我的操作执行 expire_action 时,它只会使第一页过期。我知道在使用查询字符串指定页面时缓存不起作用,我设置了一个路由,以便将页面附加到 url 的末尾(例如 /people/123/page/2)。

如有必要,我会在这篇文章中添加更多信息,但我猜这里有一些明显的遗漏,所以:有人知道如何使我的其余页面过期吗?

【问题讨论】:

  • 如果我可以从索引中排除除第一页以外的任何内容,同样有效的方法是,因为几乎没有人会查看以下页面...

标签: ruby-on-rails ruby-on-rails-3 caching pagination kaminari


【解决方案1】:

我仍然对我最初的问题的答案感兴趣,如果出现解决方案,我会更改我接受的答案。也就是说,我最终只通过检查是否指定了页面来缓存原始页面:

caches_action :index, :if => Proc.new { params[:page].nil? }

【讨论】:

【解决方案2】:

这是我想到的一个解决方案,面临同样的问题,但尚未实施。将实际到期时间缓存在自己的密钥中。关键是搜索 URL 的规范表示,即没有“page”参数。例如:

用户搜索http://example.com?q=foo&page=3,所以参数是{ q: 'foo', page: 3 }。去掉“page=3”,我们就剩下 { q: 'foo' }。

在其上运行to_param 并添加一些前缀,我们就会得到一个像search_expiry_q=foo 这样的缓存键。

为此规范查询查找缓存,即 Rails.cache.read(search_expiry_q=foo)。如果它存在,我们会让我们的结果在这个时候过期。不幸的是,我们只有expires_in,没有expires_at,所以我们必须进行计算。即expires_in: expiry_time - Time.now - 5.seconds 之类的东西(希望 5 秒可以防止任何竞争条件)。我们以这种方式缓存完整的 URL/参数。

OTOH,如果没有过期,那么最近没有人执行搜索。所以我们这样做:

expiry_time = Time.now + 1.hour
Rails.cache.write(`search_expiry_q=foo`, expiry_time, expires_in: 1.hour)

并缓存此片段/页面,再次使用完整的 URL/参数,并 expires_in: 1.hour。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-23
    • 1970-01-01
    • 2012-03-19
    • 2011-10-27
    • 1970-01-01
    • 2012-02-09
    • 1970-01-01
    相关资源
    最近更新 更多