2012-12-11 32 views
9

Máy quan sát và quét được loại bỏ khỏi Rails 4. Cool. Nhưng cách lưu bộ nhớ cache và xóa bộ nhớ cache là gì?Cách đúng để xóa bộ nhớ cache trong Rails mà không cần quét dọn là gì

Tôi đã đọc về bộ nhớ đệm của búp bê Nga. Nó đẹp và tất cả, nhưng nó chỉ liên quan đến bộ nhớ cache hiển thị chế độ xem. Nó không ngăn cơ sở dữ liệu bị tấn công.

Ví dụ:

<% cache @product do %> 
    Some HTML code here 
<% end %> 

Bạn vẫn cần phải nhận được @product từ db để có được cache_key của nó. Vì vậy, trang hoặc bộ nhớ đệm hành động vẫn có thể hữu ích để ngăn tải không cần thiết.

Tôi có thể sử dụng một số thời gian chờ để xóa bộ nhớ cache đôi khi nhưng điều gì xảy ra nếu các bản ghi không thay đổi?

Ít nhất với trình quét bạn có quyền kiểm soát trên khía cạnh đó. Điều gì sẽ là/phải cách để làm bộ nhớ cache và xóa nó?

Cảm ơn! :)

Trả lời

8

Chào mừng bạn đến một trong hai vấn đề khó khăn trong khoa học máy tính, bộ nhớ cache huỷ bỏ hiệu lực :)

Bạn sẽ phải xử lý đó bằng tay từ logic khi một đối tượng được lưu trữ, không giống như một cái nhìn cache có thể được đơn giản xuất phát từ các đối tượng mà nó hiển thị, nên bị vô hiệu là ứng dụng và tình trạng phụ thuộc.

Phương pháp goto cho phương thức này là phương pháp Rails.cache.fetch. Rails.cache.fetch có 3 đối số; khóa bộ nhớ cache, một băm tùy chọn và một khối. Đầu tiên, nó cố gắng đọc một bản ghi bộ nhớ cache hợp lệ dựa trên khóa; nếu khóa đó tồn tại và chưa hết hạn, nó sẽ trả về giá trị từ bộ nhớ cache. Nếu không thể tìm thấy bản ghi hợp lệ, thay vào đó, nó sẽ lấy giá trị trả về từ khối và lưu trữ nó trong bộ nhớ cache bằng khóa được chỉ định của bạn.

Ví dụ:

@models = Rails.cache.fetch my_cache_key do 
    Model.where(condition: true).all 
end 

này sẽ cache khối và tái sử dụng kết quả cho đến khi một cái gì đó (tm) làm mất hiệu lực then chốt, buộc các khối được đánh giá lại. Cũng xin lưu ý rằng .all ở cuối chuỗi phương pháp. Thông thường Rails sẽ trả về một đối tượng quan hệ ActiveRecord sẽ được lưu trữ và sau đó sẽ được đánh giá khi bạn cố gắng sử dụng @models lần đầu tiên, gọn gàng sidestepping bộ nhớ cache. Các lực lượng gọi .all Rails để mong muốn tải các hồ sơ và đảm bảo rằng đó là kết quả mà chúng tôi bộ nhớ cache, không phải là câu hỏi.

Vì vậy, bây giờ bạn có được tất cả bộ nhớ cache của bạn và không bao giờ nói chuyện với cơ sở dữ liệu một lần nữa, chúng tôi phải đảm bảo rằng chúng tôi bao gồm đầu kia, làm mất hiệu lực bộ nhớ cache. Điều này được thực hiện với phương thức Rails.cache.delete chỉ đơn giản là lấy một khóa bộ nhớ cache và loại bỏ nó, gây ra một lỗi trong lần sau khi bạn cố gắng lấy nó. Bạn cũng có thể sử dụng tùy chọn force: true với tìm nạp để buộc đánh giá lại khối. Cho dù phù hợp với bạn.

Khoa học của tất cả là nơi để gọi Rails.cache.delete, trong trường hợp ngây thơ này sẽ được cập nhật và xóa cho một trường hợp duy nhất và cập nhật, xóa, tạo trên bất kỳ thành viên nào cho bộ sưu tập. Sẽ luôn có trường hợp góc ong và chúng luôn luôn là ứng dụng cụ thể, vì vậy tôi không thể giúp bạn nhiều ở đó.

Tôi giả định trong câu trả lời này là bạn sẽ thiết lập một số lưu trữ bộ nhớ cache sane, như memcached hoặc Redis.

Cũng nên nhớ để thêm video này vào config/môi trường/development.rb:

config.cache_store = :null_store 

hoặc bạn môi trường phát triển sẽ cache và bạn sẽ kết thúc không có lông từ thất vọng.

Đối với đọc tham khảo thêm: Everyone should be using low level caching in RailsThe rails API docs

Nó cũng đáng chú ý chức năng mà không được lấy ra từ Rails 4, chỉ trích thành một viên ngọc. Nếu bạn cần hoặc muốn các tính năng đầy đủ của các trình quét, chỉ cần thêm nó trở lại ứng dụng của bạn với một dòng gem 'rails-observers' trong Gemfile của bạn. Viên đá quý đó chứa cả người quét và quan sát viên, nơi đã bị loại bỏ khỏi lõi Rails 4.

Tôi hy vọng rằng bạn sẽ bắt đầu.

+0

Giới thiệu về hiệu lực bộ nhớ cache của bộ nhớ cache Tôi đoán nó sẽ đưa chúng ta trở lại vai trò người quét. Thay vì gọi 'Rails.cache.delete' trong bộ điều khiển của tôi, tôi có thể sử dụng các trình quét từ đá quý ngoại vi. Tôi nghĩ trong trường hợp đó nó có ý nghĩa, phải không? Cảm ơn bạn đã trả lời :) – Happynoff

+0

Có, vai trò của trình quét khó thoát ra vì đó là một trong những điều kiện tiên quyết cho chiến lược bộ nhớ đệm hoạt động;) Tôi thường có một vòng đời cho những thứ như không hợp lệ bộ nhớ cache, nhắn tin và tương tác với các mô hình bên ngoài. Bằng cách đó bạn có một bộ điều khiển sạch, lớp lõi nhỏ và dính vào hành vi không liên quan của bạn trong một lớp khác mà lắng nghe lớp cơ sở. Về bản chất, trình quét chỉ là một trường hợp đặc biệt của một trong các lớp vòng đời này và không có gì sai với chúng như một chiến lược. –

+0

Đó là lý do tại sao tôi cảm thấy lạ về việc xóa trình dọn dẹp khỏi Rails 4. Tôi hiểu bộ nhớ đệm trang/hành động là xấu nhưng do bộ nhớ đệm ở mức thấp vẫn cần quét hoặc quét như hành vi, tôi không thấy điểm xóa chúng :( – Happynoff

Các vấn đề liên quan