2011-10-26 32 views
11

Tôi muốn sử dụng 2 bộ nhớ cache - bộ nhớ mặc định trong bộ nhớ và một bộ nhớ memcache, mặc dù trừu tượng nó không thành vấn đề (tôi nghĩ) mà hai.Làm cách nào để sử dụng nhiều bộ đệm trong đường ray? (thực tế)

Bộ nhớ mặc định trong bộ nhớ là nơi tôi muốn tải dữ liệu nhỏ và hiếm khi thay đổi. Tôi đã sử dụng bộ nhớ một cho đến nay. Tôi giữ một loạt các loại dữ liệu tên miền từ cơ sở dữ liệu trong đó, tôi cũng có một số dữ liệu nhỏ từ các nguồn bên ngoài mà tôi làm mới mỗi 15 phút - 1 giờ.

Gần đây, tôi đã thêm memcache vì hiện tôi đang phân phát một số nội dung lớn hơn. Loại phức tạp như thế nào tôi nhận được vào này, nhưng đây là lớn hơn ~ kilobyte, tương đối nhỏ về số lượng (hàng trăm), và rất dễ nhớ - chúng thay đổi, nhưng làm mới một lần mỗi giờ có lẽ là quá nhiều. Tập này có thể phát triển nhưng được chia sẻ trên tất cả các máy chủ. Làm mới là tốn kém.

Tập dữ liệu đầu tiên đã sử dụng bộ nhớ cache mặc định trong một thời gian và đã được xử lý tốt. Memcache hoàn hảo cho tập hợp dữ liệu thứ hai.

Tôi đã điều chỉnh memcache và nó hoạt động rất tốt cho tập hợp dữ liệu thứ hai. Vấn đề là bởi vì mã hiện tại của tôi đã được thực hiện 'suy nghĩ' nó đã được trong bộ nhớ địa phương, tôi đang làm một số chuyến đi để memcache theo yêu cầu, đó là tăng độ trễ của tôi.

Vì vậy, tôi muốn sử dụng 2 bộ nhớ cache. Suy nghĩ?

(lưu ý: memcache đang chạy trên các máy khác nhau hơn máy chủ của tôi. Ngay cả khi tôi chạy nó cục bộ, tôi có một nhóm máy chủ để nó không phải là địa phương cho tất cả. Ngoài ra, tôi muốn tránh cần Mặc dù tôi có thể giải quyết vấn đề này bằng cách làm cho bộ nhớ lớn hơn và chỉ sử dụng bộ nhớ (dữ liệu thực sự không lớn), điều này không giải quyết được vấn đề khi tôi mở rộng, vì vậy nó sẽ chỉ cần đá lon.)

Trả lời

15

ActiveSupport :: Cache :: MemoryStore là những gì bạn muốn sử dụng. Rails.cache sử dụng hoặc MemoryStore, FileStore hoặc trong trường hợp của tôi DalliStore :-)

Bạn có thể có thể hiện toàn cầu của ActiveSupport :: Cache :: MemoryStore và sử dụng nó hoặc tạo một lớp với một mẫu đơn chứa đối tượng này (sạch hơn). Đặt Rails.cache đến cửa hàng bộ nhớ cache khác và sử dụng singleton này cho MemoryStore

Dưới đây là lớp học này:

module Caching 
    class MemoryCache 
     include Singleton 

     # create a private instance of MemoryStore 
     def initialize 
     @memory_store = ActiveSupport::Cache::MemoryStore.new 
     end 

     # this will allow our MemoryCache to be called just like Rails.cache 
     # every method passed to it will be passed to our MemoryStore 
     def method_missing(m, *args, &block) 
     @memory_store.send(m, *args, &block) 
     end 
    end 
end 

Đây là làm thế nào để sử dụng nó:

Caching::MemoryCache.instance.write("foo", "bar") 
=> true 
Caching::MemoryCache.instance.read("foo") 
=> "bar" 
Caching::MemoryCache.instance.clear 
=> 0 
Caching::MemoryCache.instance.read("foo") 
=> nil 
Caching::MemoryCache.instance.write("foo1", "bar1") 
=> true 
Caching::MemoryCache.instance.write("foo2", "bar2") 
=> true 
Caching::MemoryCache.instance.read_multi("foo1", "foo2") 
=> {"foo1"=>"bar1", "foo2"=>"bar2"} 
6

Trong một initializer bạn có thể chỉ cần đặt:

MyMemoryCache = ActiveSupport :: Cache :: MemoryStore.new

Sau đó, bạn có thể sử dụng nó như thế này:

MyMemoryCache.fetch('my-key', 'my-value') 

v.v.

Lưu ý rằng nếu nó chỉ là để tối ưu hóa hiệu suất (và phụ thuộc vào thời gian hết hạn), nó có thể không phải là một ý tưởng tồi để vô hiệu hóa nó trong môi trường thử nghiệm của bạn, như sau:

if Rails.env.test? 
    MyMemoryCache = ActiveSupport::Cache::NullStore.new 
else 
    MyMemoryCache = ActiveSupport::Cache::MemoryStore.new 
end 

Rails đã cung cấp này bằng cách cho phép bạn đặt các giá trị khác nhau config.cache_store trong trình khởi tạo môi trường của mình.

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