12/08/2018, 13:06

Fragment Caching In Rails

Fragment Caching là cách lưu trữ một phần views vào trong cache. Thường thì sẽ caching partials hoặc một phần lớn HTML, và những nội dung được caching sẽ riêng biệt, không liên quan tới những phần khác. Ví dụ như: Một danh sách employees, hoặc những nội dung tương tự như vậy. 1. Hoạt động? ...

Fragment Caching là cách lưu trữ một phần views vào trong cache. Thường thì sẽ caching partials hoặc một phần lớn HTML, và những nội dung được caching sẽ riêng biệt, không liên quan tới những phần khác. Ví dụ như: Một danh sách employees, hoặc những nội dung tương tự như vậy.

1. Hoạt động?

Rails cung cấp cache view helper cho Fragment Caching. Đơn giản nhất là không cần một tham số nào bên trong block cache. Bất cứ gì được render trong block sẽ được lưu vào cache. Nguyên tắc cơ bản bên trong Fragment Caching là làm sao để tốn ít thời gian render lại HTML từ cache. Nếu như chúng ta không chú ý thì việc đó sẽ gây lãng phí tài nguyên rất lớn. Vậy nên chúng ta cần triển khai caching đúng cách.

Để bắt đầu, chúng ta cần hiểu quá trình tạo và đọc nội dung từ cache.

Ví dụ:

$ rails g scaffold post title:string content:text author:string

Tạo ra cache như sau:

<%= cache "post-#{@post.id}" do %>
  <p>
    <b>Title:</b>
    <%= @post.title %>
  </p>

  <p>
    <b>Content:</b>
    <%= @post.content %>
  </p>
<% end %>

Lần đầu tiên khi chúng ta thực hiện request, chúng ta nhận được:

Exist fragment? views/post-2 (1.6ms)
Write fragment views/post-2 (0.9ms)

Chúng ta có thể thấy được, Rails kiểm tra để biết được cache tồn tại với cache key hay không. Từ đó nó sẽ thực hiện lấy cache content hay tạo ra cache. Trường hợp này, không có cache content, do đó cache content sẽ được tạo ra. Bây giờ, chúng ta thực hiện một request tương tự khác và cùng xem kết quả:

Exist fragment? views/post-2 (0.6ms)
Read fragment views/post-2 (0.0ms)

Lần này, nội dung được lấy ra từ cache thay vì render.

Tuy nhiên, khi nội dung của post bị thay đổi thì sao? Khi post thay đổi thì việc đọc từ cache content và hiện thị lên không còn đúng nữa. Chúng ta đều biết, cache được build ra theo key-value. Vậy nên, để xử lý vấn đề trên, chỉ cần tạo thay đổi cache key mỗi khi post thay đổi là được. Có một trường bên trong mỗi object luôn thay đổi khi object thay đổi là updated_at. Do đó, việc sử dụng updated_at để làm cache key là một lựa chọn đơn giản và hiểu quả. Cách này sẽ thay đổi cache key mỗi khi mà nội dung thay đổi, đồng nghĩa với việc chúng ta sẽ không cần phải can thiệp tới những cache hết hạn bằng cách thông thường.

Thay đổi cahe key như sau:

<% cache "post-#{@post.id}", @post.updated_at.to_i do %>

Thử request lại và xem rails log chúng ta sẽ thấy:

Exist fragment? views/post-2/1304291241 (0.5ms)
Write fragment views/post-2/1304291241 (0.4ms)

OK, cache key đã thay đổi             </div>
            
            <div class=

0