【问题标题】:Fragment cache not updating key when db records changes数据库记录更改时片段缓存不更新键
【发布时间】:2019-07-18 16:43:58
【问题描述】:

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

我得到的是 json 格式的数据。

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

当我更改或添加任何新的 html 元素时,然后消化键更改并刷新缓存。但后端的变化不会改变任何东西。

如何解决这个问题?

【问题讨论】:

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


    【解决方案1】:

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

    让我们考虑下面的例子来了解缓存键是如何更新的:

    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. Rails 然后在config.cache_store 中搜索此键。对于开发环境,它通常设置为file(保存在/tmp 中)。对于生产,您应该使用一些缓存服务器,例如 Redis 或 Memcached。

    希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-02
      • 1970-01-01
      • 1970-01-01
      • 2012-12-31
      相关资源
      最近更新 更多