Khái niệm bộ nhớ đệm là một khái niệm quan trọng trong khoa học máy tính và có liên quan trực tiếp đến việc xây dựng ứng dụng web. Ở mức cao, bộ nhớ đệm tận dụng thực tế là việc tra cứu bộ nhớ nhanh hơn và ít tính toán hơn so với các truy vấn cơ sở dữ liệu. Nếu bạn có một truy vấn cơ sở dữ liệu có thể được thực hiện nhiều lần, thì việc lưu kết quả vào bộ đệm vào bộ đệm sẽ tăng tốc luồng thực thi đó. Các ứng dụng Rails cũng không ngoại lệ vì chúng thường sử dụng bộ nhớ đệm dựa trên bộ nhớ như Redis để lưu trữ dữ liệu và cải thiện hiệu suất ứng dụng.

Ý tưởng sử dụng bộ đệm cơ sở dữ liệu nghe có vẻ không hiệu quả. Tuy nhiên, việc sử dụng bộ nhớ đệm dựa trên cơ sở dữ liệu chậm hơn như Solid Cache trong Rails có thể tăng tốc ứng dụng một cách phản trực giác vì bộ nhớ rẻ hơn cho phép chúng ta lưu vào bộ nhớ đệm nhiều thứ hơn trong thời gian dài hơn. Trong Rails 7.1, Solid Cache đã được giới thiệu, làm cho bộ đệm ứng dụng dựa trên cơ sở dữ liệu trở thành một tùy chọn thuận tiện cho ứng dụng Rails!
Cách hoạt động của bộ đệm Rails
Bộ nhớ đệm trong Ruby on Rails là một phần quan trọng trong việc tối ưu hóa hiệu suất ứng dụng. Có một số loại bộ nhớ đệm mà nhà phát triển có thể sử dụng để nâng cao hiệu suất:bộ nhớ đệm trang, bộ nhớ đệm hành động, bộ nhớ đệm phân đoạn, bộ nhớ đệm cấp thấp, bộ nhớ đệm SQL, v.v. Trong bài viết này, chúng ta sẽ chủ yếu thảo luận về bộ nhớ đệm cấp thấp vì nó đơn giản và tương thích với cache_store có thể định cấu hình .
ActiveSupport, một phần lớn của Rails framework, cho phép chúng ta tương tác và định cấu hình bộ đệm thông qua cache_store . Trong config/environments/ , có các tệp với mỗi tên môi trường ở nhiều cấu hình khác nhau, bao gồm cả lựa chọn cache_store.
Đặt giá trị cache_store
Redis là một kho lưu trữ bộ đệm cực kỳ phổ biến và đã được áp dụng rộng rãi trong toàn ngành. Nếu một ứng dụng đang sử dụng Redis để lưu vào bộ đệm trong quá trình sản xuất, bạn sẽ thấy dòng Ruby sau trong config/environments/production.rb :
config.cache_store = :redis_cache_store
Redis được sử dụng vì nó là bộ nhớ đệm và theo truyền thống, bộ nhớ có thời gian truy cập đọc nhanh hơn nhiều so với truy cập ổ đĩa hoặc truy vấn cơ sở dữ liệu.
Lưu vào bộ nhớ đệm truy vấn cơ sở dữ liệu trong Rails
Bạn có thể đang sử dụng bộ đệm ẩn cấp thấp để lưu trữ kết quả của một truy vấn cơ sở dữ liệu đắt tiền trả về dữ liệu không thường xuyên thay đổi. Nó có thể trông giống như thế này:
Rails.cache.fetch("courses", expires_in: 12.hours) do
Courses.all
end
Nếu bạn đang sử dụng Redis làm kho lưu trữ bộ nhớ đệm thì trước tiên, mã này sẽ xem xét liệu khóa "khóa học" có giá trị trong 12 giờ qua hay không. Nếu đúng như vậy, nó sẽ chỉ trả về giá trị đó mà không thực thi khối mã. Nếu bộ nhớ đệm không có giá trị đó thì nó được gọi là "lỗi bộ nhớ đệm". Việc thiếu bộ đệm sẽ dẫn đến việc trình thông dịch thực thi khối, lưu trữ kết quả vào bộ đệm và sau đó trả về kết quả.
Rails Solid Cache là gì?
Mẫu bộ nhớ đệm mà chúng ta đã trình bày ở trên mang lại lợi ích về hiệu suất vì khả năng truy cập bộ nhớ nhanh hơn, chẳng hạn như lệnh gọi API và truy vấn cơ sở dữ liệu. Tuy nhiên, bộ nhớ đắt tiền , và do đó bị hạn chế. Vì bộ nhớ có hạn nên chúng ta phải giảm thiểu những gì chúng ta lưu trữ trong bộ đệm và trong bao lâu. Bạn không thể lưu trữ mọi thứ vào bộ nhớ đệm trong một khoảng thời gian không xác định vì bộ nhớ trong bộ nhớ đệm của bạn sẽ nhanh chóng hết. Lợi ích hiệu suất từ bộ nhớ đệm là tất cả về sự cân bằng. Bạn lưu vào bộ nhớ đệm một số nội dung trong một thời gian để không phải lặp lại các tác vụ tốn nhiều thời gian.
Bản phát hành Rails 7.1 đi kèm với Solid Cache, một tùy chọn cho ActiveRecord::Cache::Store sử dụng cơ sở dữ liệu SQL để lưu trữ bộ đệm. Mỗi lần đọc từ bộ nhớ đệm chậm hơn, nhưng nhờ những tiến bộ trong công nghệ và bộ nhớ đệm tích hợp trong nhiều cơ sở dữ liệu, sự khác biệt vẫn có lợi.
Việc sử dụng cơ sở dữ liệu SQL làm kho lưu trữ bộ nhớ đệm sẽ mang lại cho bạn dung lượng lưu trữ lớn hơn gấp nhiều lần với chi phí thậm chí còn thấp hơn, cho phép ứng dụng của bạn lưu vào bộ nhớ đệm nhiều dữ liệu hơn nữa trong khoảng thời gian dài hơn. Nhóm Basecamp đã viết một bài viết về cách điều này tăng tốc ứng dụng của họ, điều này có vẻ phản trực giác.
Khi nào bạn nên sử dụng Solid Cache?
Mặc dù các bộ nhớ đệm như Redis thường cung cấp tốc độ đọc từ bộ nhớ đệm nhanh hơn, nhưng Solid Cache là giải pháp thay thế tốt cho các tùy chọn đó trong một số trường hợp.
Nếu ứng dụng của bạn yêu cầu lưu trữ một lượng lớn dữ liệu vào bộ nhớ đệm thì việc lưu trữ dữ liệu đó vào bộ nhớ có thể trở nên cực kỳ tốn kém. Solid Cache cho phép kích thước bộ đệm lớn hơn nhiều với chi phí thấp hơn.
Nếu ứng dụng của bạn không có độ nhạy cao với thời gian truy xuất bộ đệm được thêm vài mili giây, Solid Cache sẽ cung cấp sự cân bằng tuyệt vời giữa hiệu suất và chi phí. Nếu bạn chấp nhận được khả năng độ trễ tăng lên thì Solid Cache là một giải pháp tốt.
Riêng biệt, trong các thiết lập mà việc quản lý một phiên bản Redis riêng biệt là không thực tế, Solid Cache đơn giản hóa việc triển khai bằng cách cho phép cơ sở dữ liệu hiện tại của bạn xử lý bộ nhớ đệm mà không cần hỗ trợ Redis.
Cài đặt Solid Cache
Solid Cache Readme có hướng dẫn hữu ích về cách đưa nó vào ứng dụng Rails. Đầu tiên, thêm đá quý vào Gemfile của bạn:
gem "solid_cache"
Tiếp theo cài đặt bằng Bundler:
bundle install
Tiếp theo, thêm di chuyển để cơ sở dữ liệu của bạn hoạt động với Solid Cache. Chạy như sau:
bin/rails solid_cache:install:migrations
Cuối cùng, chạy di chuyển đã tạo:
bin/rails db:migrate
Triển khai Solid Cache trong ứng dụng Rails
Việc hoán đổi Solid Cache cho bộ đệm hiện có thường đơn giản. Trong cấu hình môi trường của bạn, chẳng hạn như config/environments/production.rb , thay đổi cache_store cài đặt như sau:
config.cache_store = :solid_cache_store
Đây là tất cả những gì cần thiết để bắt đầu sử dụng Solid Cache làm kho lưu trữ bộ đệm của bạn! Nó hỗ trợ tất cả ActiveSupport::Cache::Store khác các tùy chọn cấu hình cũng như các tùy chọn bổ sung để hỗ trợ phân mảnh cơ sở dữ liệu hoặc các nhu cầu đặc biệt khác.
Bạn nên lưu ý rằng điều này chỉ thay đổi kho lưu trữ bộ đệm trong quá trình sản xuất, vì vậy nếu bạn định thử nghiệm trong các môi trường khác, bạn cũng nên thay đổi giá trị ở đó.
Bạn sẽ chuyển sang Solid Cache trong Rails chứ?
Sự ra đời của Solid Cache trong Rails 7.1 đã đánh dấu một bước phát triển đáng kể trong thế giới chiến lược bộ đệm Rails. Giải pháp này mang đến một góc nhìn mới về tối ưu hóa hiệu suất ứng dụng, thách thức ưu tiên truyền thống về bộ nhớ đệm dựa trên bộ nhớ như Redis.
Bằng cách tận dụng cơ sở dữ liệu SQL để lưu vào bộ đệm, Solid Cache cho phép các ứng dụng lưu trữ khối lượng dữ liệu lớn hơn trong thời gian dài, từ đó khắc phục các hạn chế do chi phí và dung lượng lưu trữ bộ nhớ đặt ra. Cách tiếp cận này không chỉ mở rộng số lượng nội dung có thể được lưu vào bộ nhớ đệm một cách hiệu quả mà còn có khả năng mang lại lợi ích hiệu suất lớn hơn nữa.
Điều đó có nghĩa là quyết định chuyển đổi tùy thuộc vào nhu cầu cụ thể của ứng dụng của bạn. Nếu ứng dụng của bạn được hưởng lợi đáng kể từ bộ nhớ đệm tốc độ cao và bạn có cơ sở hạ tầng để hỗ trợ Redis thì bạn có thể không cần Solid Cache. Tuy nhiên, nếu bạn đang tìm kiếm một cách tiết kiệm chi phí để lưu trữ lượng lớn dữ liệu mà không cần thêm dịch vụ khác vào ngăn xếp của mình, Solid Cache có thể đáng để khám phá. Ngay cả khi bạn chỉ muốn tránh phải hỗ trợ Redis, Solid Cache có thể vẫn đủ tốt cho ứng dụng của bạn.
Nếu bạn thích bài viết này, hãy đăng ký nhận bản tin Honeybadger để nhận thêm các bài viết về Ruby và Rails tương tự như bài viết này trong hộp thư đến của bạn.