【问题标题】: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 对象更新时,密钥就会更新。它是如何工作的:
请注意,我们的密钥中的动态部分是user.id 和user.updated_at。因此,仅当更改此特定用户的 updated_at 时,密钥才会更新(并且缓存会被破坏)。
当用户(通过浏览器或其他任何方式)请求此页面时,Rails 会尝试呈现此代码片段。
- 每次遇到这个片段时,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”。 检查两个键上的时间分量。这就是缓存键真正过期的原因。
- Rails 然后在
config.cache_store 中搜索此键。对于开发环境,它通常设置为file(保存在/tmp 中)。对于生产,您应该使用一些缓存服务器,例如 Redis 或 Memcached。
希望这会有所帮助。