部分缓存过期

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

这应该会自动为您创建和过期每个缓存。不需要任何清扫方法。