db记录更改时,片段缓存不更新密钥

时间:2019-07-18 16:43:58

标签: ruby-on-rails ruby memcached fragment-caching

使用片段缓存摘要来缓存数据。我面临的问题是,当数据库记录更改时,缓存键应重新生成,但不刷新并显示旧数据。

我以json格式获取数据。

cache "home_index_makes_listing_12_grid",:expires_in => 24.hours do
    yield
end

当我更改或添加任何新的html元素时,请摘要摘要并更改缓存。但是从后端更改不会更改任何内容。

如何解决该问题?

1 个答案:

答案 0 :(得分:1)

在数据库中更新记录时,缓存键不会自动更改。缓存无法以某种方式知道数据库中的值已更改。

让我们考虑以下示例,以了解如何更新缓存键:

cache "home_index_makes_listing_#{user.id}_#{user.updated_at}_grid", expires_in: 24.hours do
  ...
end

只要user对象被更新,密钥就会被更新。运作方式:

  1. 请注意,密钥中的动态部分为user.iduser.updated_at。因此,仅当更改此特定用户的updated_at时,密钥才会更新(并且缓存无效)。

  2. 当用户(通过浏览器或其他方式)请求此页面时,Rails尝试呈现此代码片段。

  3. 每次遇到此片段时,Rails都会评估缓存键的值。例如:“ home_index_makes_listing_23_Sat,2019年6月15日19:50:39 IST +05:30_grid”或“ home_index_makes_listing_23_Sat,2019年6月15日19:50:59 IST +05:30_grid”。 检查两个键上的时间部分。这就是缓存密钥真正过期的方式。
  4. 导轨然后在config.cache_store中搜索该键。对于开发环境,通常将其设置为file(保存在/ tmp中)。对于生产,您应该使用某些缓存服务器,例如Redis或Memcached。

希望这会有所帮助。