0

我在这里提出了很多关于缓存的问题,但没有一个答案。所以也许我会对此有答案。

我的搜索模型代码如下:

users = users.where('id >?', my_value)

Rails.cache.fetch('my_cached',expires_in: 3.minutes) do

    users = users.order('current_sign_in_at DESC')

end

有人可以解释一下这是做什么的。我认为这将返回已排序的用户表并将其放入缓存中 3 分钟,因此当我需要下一次搜索时,如果它没有过期,它将返回我的 my_cached 结果。

但它不是那样工作的。当某些用户登录和 current_sign_in_at 更改时 - 缓存被覆盖并返回新查询。

4

1 回答 1

0

我对 RoR 的缓存过程不是很有经验,但我认为你说的是​​对的。

我认为这将返回已排序的用户表并将其放入缓存中 3 分钟,因此当我需要下一次搜索时,如果它没有过期,它将返回我的 my_cached 结果。

然后,我认为在这件事上应该做缓存:

Rails.cache.fetch('my_cached',expires_in: 3.minutes) do
    User.where('id >?', my_value).order('current_sign_in_at DESC')
end

请记住,可能存在一些可以在分配的过期时间之前使缓存过期的规则。这取决于用户模型的配置方式。

同样,仅当您使用变量时才会执行查询my_cached。也许您看到的查询来自另一个过程(如果您使用它,可能来自设计本身?)

一些有用的参考

更新

如果变量经常更改(可能是一个随机值),那么只有当它与之前的(3 分钟内)值相同时my_value才会使用缓存。my_value

也许变量的替代解决方案my_value可以是:

Rails.cache.fetch('my_cached',expires_in: 3.minutes) do
    User.all # cache all users
end
# then filter the cached value by the my_value and order it
于 2013-09-01T15:50:36.503 回答