Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Ruby

Chọn Cache Store Phù Hợp Cho Rails: Hướng Dẫn Chi Tiết

Khi tạo ứng dụng Rails mới, caching đã được cấu hình sẵn. Việc bắt đầu nhanh chóng chỉ cần bọc các fragment view bằng helper cache hoặc dùng Rails.cache.fetch để lưu kết quả API bên ngoài. Dữ liệu cache được lưu trong một trong các cache store của Rails, có thể giữ dữ liệu trong bộ nhớ, Memcached, Redis, thậm chí ghi thẳng ra disk.

Nhưng cache store nào tốt cho tình huống nào? Trong bài này, chúng ta sẽ xem xét từng lựa chọn.

👋 Nếu thích bài này, xem thêm về hiệu suất Ruby (on Rails) tại checklist giám sát hiệu suất Ruby của chúng tôi.

File Store

:file_store được dùng mặc định khi không cấu hình cache store cụ thể. Như tên gọi, nó ghi cache entry vào file system. Chúng nằm trong thư mục tmp/cache trong root ứng dụng trừ khi bạn chọn vị trí khác bằng cách thiết lập cấu hình cache_store thành :file_store kèm đường dẫn thư mục mong muốn.

config.cache_store = :file_store , "/path/to/cache/directory"

File cache được lưu trên disk và không tự động dọn dẹp. Bạn cần tự lo việc xóa để tránh lấp đầy disk. Ví dụ, chạy Rails.cache.cleanup định kỳ sẽ giữ cache sạch khỏi entry hết hạn.

File store hữu ích trong development vì mỗi entry lưu trong thư mục cache, cho phép xóa item khỏi cache bằng cách xóa file. Hữu ích cho test cache invalidation.

Trong production, file store hữu ích khi mỗi server process chạy trên cùng file system. Mặc dù chậm hơn memory-based cache store, file store tuyệt vời nếu cache có thể lớn rất nhiều.

Memory Store

Từ version 5.0, Rails tự động thiết lập :memory_store trong cấu hình development khi tạo app mới. Khi dùng memory store, dữ liệu cache giữ trong bộ nhớ của process Ruby web server.

Vì dữ liệu trong bộ nhớ cùng process với web server, memory store tuyệt vời cho development vì tự động xóa khi restart development web server.

Mặc định, in-memory store dùng 32MB, nhưng có thể override bằng option :size khi cấu hình cache store.

config.cache_store = :memory_store, { size: 16.megabytes }

Khi cache đầy, entry ít dùng gần nhất (least recently used) tự động bị loại để chỗ cho entry mới.

Dùng memory store trong production có thể (và là giải pháp nhanh nhất), nhưng không khuyến khích cho hệ thống chạy multiple server processes. Vì process không truy cập cache của nhau, mỗi process phải maintain bản copy cache riêng.

Memcache Store

:mem_cache_store dùng gem Dalli và Memcached để lưu entry trong centralized, in-memory cache.

Dữ liệu giữ trong process riêng biệt thay vì Ruby server process. Do đó, cache không bị xóa khi app restart mà ở trong bộ nhớ miễn là Memcached server vẫn chạy. Khi restart Memcached, bạn bắt đầu với cache mới.

Memcache store mặc định giả định cache server chạy trên localhost, nhưng có thể truyền một hoặc nhiều địa chỉ cho remote server.

config.cache_store = :mem_cache_store, "cache-1.example.com", "cache-2.example.com"

Memcached mặc định dùng max cache size 64MB, có thể cấu hình qua command line options hoặc file memcached.conf. Giống memory store, nó bắt đầu xóa item ít dùng gần nhất khi cache đạt max size.

:mem_cache_store là cache store首选 cho production environment. Bằng cách dùng central memcached server, cache có thể share giữa multiple web servers thậm chí multiple hosts khi dùng remote memcached server.

Redis Cache Store

Rails 5.2 giới thiệu :redis_cache_store, cho phép lưu cache entry trong Redis, tương tự Memcache store.

Để dùng Redis làm Rails cache store, hãy dùng dedicated Redis cache được thiết lập như cache LRU (Last Recently Used) thay vì trỏ store vào Redis server hiện có, để đảm bảo entry bị xóa khi store đạt max size.

Redis store hoạt động với gem Redis (kể cả Redis::Distributed) và hiredis, cũng như hỗ trợ nhiều tùy chọn cấu hình, như thiết lập một hoặc nhiều remote server.

cache_servers = %w[redis://cache-01:6379/0 redis://cache-02:6379/0] config.cache_store = :redis_cache_store, { url: cache_servers }

Redis định kỳ ghi dataset ra disk, nên hầu hết cached data sẽ sống sót khi cache server restart. Trong development, cached item có thể xóa từ console bằng Rails.cache.delete.

Trong production, Redis cạnh tranh Memcached trong việc cung cấp centralized cache store. Mặc dù dùng trong Rails app chưa phổ biến như Memcached, Redis store có thể sẽ trở thành cache store phổ biến trong tương lai.

Nên Dùng Cache Store Nào?

Nói chung, file và memory store của Rails tuyệt vời cho development nhưng có thể dùng production cho app nhỏ khi hiểu rõ hạn chế. Memcached và Redis store cấp production thường là lựa chọn tốt hơn cho app production lớn, đặc biệt khi chạy multiple web servers trên multiple hosts.

Kết thúc overview cache store trong Rails. Hãy xem phần Cache stores trong Rails guides để biết thêm thông tin và tùy chọn cấu hình cho từng store.

Bạn thấy bài này và các bài trước trong series AppSignal Academy như thế nào? Chúng tôi còn nhiều bài về caching trong Rails, đừng ngần ngại cho biết bạn muốn chúng tôi viết về chủ đề gì (liên quan caching hay không) tiếp theo!