Bạn đang tìm kiếm fragment caching tại đây, xuất hiện trên lớp chế độ xem. Việc lưu trữ bộ nhớ đệm và hết hạn nội dung được lưu trữ thật đáng ngạc nhiên. Bạn có một danh sách các cuốn sách, vì vậy chúng ta hãy nói xem bạn trông hơi như thế này:
<ul>
<% @books.each do |book| %>
<li><%= book.name %></li>
<% end %>
</ul>
Để kích hoạt bộ nhớ đệm chỉ bit này, chỉ cần bọc nó trong cache
:
<% cache do %>
<ul>
<% @books.each do |book| %>
<li><%= book.name %></li>
<% end %>
</ul>
<% end %>
Tất nhiên, đây không đặt tên bộ nhớ cache hoặc làm bất cứ điều gì thực sự đặc biệt với nó ... trong khi Rails sẽ tự động chọn một tên duy nhất cho đoạn bộ nhớ cache này, nó sẽ không thực sự hữu ích. Chúng ta có thể làm tốt hơn. Hãy sử dụng kỹ thuật key-based cache expiration của DHH và đặt tên bộ nhớ cache liên quan đến nội dung của nó.
<% cache ['book-list', *@books] do %>
<ul>
<% @books.each do |book| %>
<li><%= book.name %></li>
<% end %>
</ul>
<% end %>
Chuyển đối số vào bộ nhớ cache sẽ tạo khóa bộ nhớ cache từ đối số được cung cấp. Các chuỗi được truyền trực tiếp - vì vậy, ở đây, bộ nhớ cache sẽ luôn được bắt đầu bằng 'danh sách sách'. Điều này là để ngăn chặn va chạm bộ nhớ cache với những nơi khác mà bạn có thể đang lưu vào bộ nhớ đệm cùng một nội dung, nhưng với một chế độ xem khác. Đối với mỗi thành viên của mảng @books, Rails sẽ gọi cache_key
: đối với đối tượng ActiveRecord, điều này sẽ tạo ra một chuỗi bao gồm mô hình, ID và chủ yếu là lần cuối đối tượng được cập nhật.
Điều này có nghĩa là khi bạn cập nhật đối tượng, khóa bộ nhớ cache cho đoạn này sẽ thay đổi. Nói cách khác, nó tự động bị hết hạn - khi một cuốn sách được cập nhật, câu lệnh cache này sẽ tìm kiếm một khóa không tồn tại, kết luận nó không tồn tại và điền nó với nội dung mới. Cũ, nội dung cũ sẽ kéo dài trong cửa hàng bộ nhớ cache của bạn cho đến khi bị trục xuất bởi bộ nhớ hoặc hạn chế tuổi tác (memcached thực hiện điều này tự động).
Tôi sử dụng kỹ thuật này trong một số ứng dụng sản xuất và nó hoạt động tuyệt vời. Để biết thêm thông tin, hãy xem 37signals post và để biết thông tin bộ nhớ đệm chung trong Rails, hãy xem Ruby on Rails caching guide.
+1 trên splatting bộ sưu tập @books. Không bao giờ nghĩ về điều đó, tôi thường sẽ chỉ lấy bản ghi sách mới nhất được cập nhật trong toàn bộ bảng và sử dụng – cpuguy83
Bạn cũng nên lưu vào bộ nhớ cache từng cuốn sách để một cuốn sách thay đổi không làm hỏng toàn bộ bộ nhớ cache. – cpuguy83