2012-01-13 39 views
8

Tôi có một ứng dụng đường ray, trong đó tôi đang sử dụng bộ nhớ cache đường ray đơn giản. thử nghiệm của tôi là như sau:Rails cache hết hạn

Rails.cache.write('temp',Date.today,:expires_in => 60.seconds) 

tôi có thể đọc nó qua Rails.cache.read('temp')Rails.cache.fetch('temp').

Vấn đề là nó không hết hạn. Nó sẽ vẫn còn sống sau 60 giây. Bất cứ ai có thể cho tôi biết những gì còn thiếu ở đây.

FYI: Tôi đã khai báo trong development.rb của tôi như sau:

config.action_controller.perform_caching = true 

config.cache_store = :memory_store 

Có cách nào tôi bỏ lỡ? Tôi muốn hết hạn bộ nhớ cache của mình.

Trả lời

9

Sau một số tìm kiếm, tôi đã tìm thấy một lý do có thể khiến bộ nhớ cache không được làm sạch sau 60 giây.

  1. Bạn gọi Rails.cache.write được ghi thành tài liệu here.
  2. Gọi số write_entry(namespaced_key(name, options), entry, options), trong đó tùy chọn :expires_in là một phần của đối số options.
  3. Các implementation of write_entry có điều kiện sau đây:

    if expires_in > 0 && !options[:raw] 
        # Set the memcache expire a few minutes in the future to support race condition ttls on read 
        expires_in += 5.minutes 
    end 
    

Vì vậy, có 5 phút thêm vào 60 giây của bạn. 2 giải pháp khả thi:

  • Chỉ cần sống với nó :-)
  • Cố gắng bao gồm các tùy chọn :raw => true, có lẽ đây sẽ bỏ qua điều kiện, do đó hết hạn của bạn hoạt động như nghi ngờ.
+0

Cảm ơn bạn đã phát lại .... hãy để tôi thử và cho bạn biết – palani

+0

Có mliebelt đúng, cũng là tài liệu về bộ nhớ cache tốt có thể tìm thấy tại đây http://guides.rubyonrails.org/caching_with_rails.html –

5

Tùy chọn :expires_in chỉ hoạt động với các cửa hàng tương thích (ví dụ: memcached) - không phải bộ nhớ.

Từ http://guides.rubyonrails.org/caching_with_rails.html:

Cuối cùng, nếu bạn đang sử dụng memcached hoặc ehcache, bạn cũng có thể vượt qua : expires_in. Trong thực tế, tất cả các tham số không được sử dụng bởi caches_action là được gửi đến kho lưu trữ cache bên dưới.

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