部分缓存过期
Partial cache expiration
在我的 Rails 应用程序中,我使用像这样的常规片段缓存:
- cache "books", skip_digest: true do
- @books.each do |book|
= book.title
= book.author
为了管理缓存过期,我使用了清理器:
class BookSweeper < ActionController::Caching::Sweeper
observe Book
def after_update(book)
expire_fragment "books"
end
end
假设我有 100 本书,其中 1 本书被删除或更改。然后书籍缓存将过期,第一个站点访问者将体验到较慢的页面,因为必须创建新的缓存。
有没有办法只更新那一本书的缓存,而不是使 99 本未更改图书的整个缓存过期?还是全有或全无?
来自Guides
You can also use an Active Record model as the cache key:
<% Product.all.each do |p| %>
<% cache(p) do %>
<%= link_to p.name, product_url(p) %>
<% end %>
<% end %>
在你的情况下尝试这种方法,比如这样
- @books.each do |book|
- cache "book", skip_digest: true do
= book.title
= book.author
然后像这样更改 after_update(book)
方法
def after_update(book)
expire_fragment "book"
end
虽然不确定,只是提供一个想法。
不再需要手动使缓存过期 - Rails 现在自动实现基于密钥的过期。因此,您可以像这样轻松地为每本书创建一个唯一的缓存:
- @books.each do |book|
- cache book, skip_digest: true do
= book.title
= book.author
这应该会自动为您创建和过期每个缓存。不需要任何清扫方法。
在我的 Rails 应用程序中,我使用像这样的常规片段缓存:
- cache "books", skip_digest: true do
- @books.each do |book|
= book.title
= book.author
为了管理缓存过期,我使用了清理器:
class BookSweeper < ActionController::Caching::Sweeper
observe Book
def after_update(book)
expire_fragment "books"
end
end
假设我有 100 本书,其中 1 本书被删除或更改。然后书籍缓存将过期,第一个站点访问者将体验到较慢的页面,因为必须创建新的缓存。
有没有办法只更新那一本书的缓存,而不是使 99 本未更改图书的整个缓存过期?还是全有或全无?
来自Guides
You can also use an Active Record model as the cache key:
<% Product.all.each do |p| %>
<% cache(p) do %>
<%= link_to p.name, product_url(p) %>
<% end %>
<% end %>
在你的情况下尝试这种方法,比如这样
- @books.each do |book|
- cache "book", skip_digest: true do
= book.title
= book.author
然后像这样更改 after_update(book)
方法
def after_update(book)
expire_fragment "book"
end
虽然不确定,只是提供一个想法。
不再需要手动使缓存过期 - Rails 现在自动实现基于密钥的过期。因此,您可以像这样轻松地为每本书创建一个唯一的缓存:
- @books.each do |book|
- cache book, skip_digest: true do
= book.title
= book.author
这应该会自动为您创建和过期每个缓存。不需要任何清扫方法。