2014-10-06 22 views
2

我有一個聚集了一堆從代碼數據的利用Rails.cache爲小塊的數據在這裏和那裏的API端點。然而,有時候我想要100%的最新數據,就好像Rails.cache是​​空的一樣。很明顯,我可以在聚合數據之前清除緩存,但這會影響無關的數據和請求。我如何繞過Rails.cache單個請求或代碼塊?

有沒有辦法,我有個請求在軌充當如果Rails.cache是​​空的,如果同樣是Rails.cache配置是:null_store?

在ActiveRecord的查詢緩存有這樣的事情 - 一個「非高速緩存」功能,你可以通過一個塊,其中塊將運行W 0啓用/查詢緩存。我需要類似的東西,但一般來說Rails.cache。

+0

? – jrochkind 2014-10-07 05:27:17

+0

我正在使用rails 3.2.17。緩存是標準的Rails.cache - 在railties gem中的rails.rb中定義。 – 2014-10-07 15:04:31

回答

1

因爲它不會出現在那裏是一個解決方案開箱,我編寫了我自己的解決方案通過添加以下代碼爲config /初始化/ rails_cache.rb

module Rails 
    class << self 
    alias :default_rails_cache :cache 
    def cache 
     # Allow any thread to override Rails.cache with its own cache implementation. 
     RequestStore.store[:rails_cache] || default_rails_cache 
    end 
    end 
end 

這允許任何線程來指定自己的緩存存儲,然後將用於所有讀取,讀取和寫入。因此,它不會從默認Rails.cache讀,也不會它的值寫入到默認Rails.cache。

如果線程是由具有啓用高速緩存長期運行和效益,您可以輕鬆地將其設置爲自己的MemoryStore的實例:

RequestStore.store[:rails_cache] = ActiveSupport::Cache.lookup_store(:memory_store) 

,如果你想緩存徹底關閉這個線程,您可以: null_store而不是:memory_store。

如果您未使用request_store gem,則可以使用「Thread.current」替換「RequestStore.store」以獲得相同的效果 - 只需要更加小心跨請求的線程重用。

API的鋼軌您使用的是緩存在首位的數據,
相關問題