歡迎的計算機科學兩個硬盤的問題之一,緩存失效:)
你將不得不到手動處理,因爲對當緩存的對象,不像緩存的視圖可以是簡單的邏輯從它顯示的對象派生而來,應該是無效的,這取決於應用程序和情況。
你爲此的方法是Rails.cache.fetch
方法。 Rails.cache.fetch
需要3個參數;緩存鍵,選項散列和塊。它首先嚐試讀取基於密鑰的有效緩存記錄;如果該鍵存在且未過期,則會從緩存中返回該值。如果找不到有效的記錄,它將從塊中獲取返回值,並將其與指定的密鑰一起存儲在緩存中。
例如:
@models = Rails.cache.fetch my_cache_key do
Model.where(condition: true).all
end
這將緩存塊和重用結果等到的東西(TM)無效的關鍵,迫使該塊被重新評估。還要注意方法鏈末尾的.all
。通常Rails會返回一個將被緩存的ActiveRecord關係對象,然後當你第一次嘗試使用@models
時,會對它進行評估,整齊地避開緩存。 .all
調用迫使Rails急切地加載記錄,並確保它是我們緩存的結果,而不是問題。
所以,現在你已經獲得了所有的緩存並且再也不會與數據庫再次交談,所以我們必須確保覆蓋另一端,使緩存無效。這是通過僅使用緩存鍵並將其刪除的Rails.cache.delete
方法完成的,下次嘗試獲取時會導致錯過。您也可以使用force: true
選項來強制重新評估塊。哪個適合你。
它的科學全部是在哪裏調用Rails.cache.delete
,在天真的情況下,這將是更新和刪除單個實例和更新,刪除,創建集合的任何成員。總會有蜜蜂角落的情況,他們總是應用程序的具體情況,所以我在那裏幫不了你。
我假設在這個答案中,你將設置一些理智的緩存存儲,如memcached或Redis。
還記得它添加到配置/環境/ development.rb:
config.cache_store = :null_store
,或者你的開發環境將緩存,你會從挫折最終無毛。
爲了進一步參考讀:Everyone should be using low level caching in RailsThe rails API docs和
還值得一提的是功能不從軌道4去除,僅僅提取到的寶石。如果您需要或想要掃描儀的全部功能,只需在您的Gemfile中使用gem 'rails-observers'
行將其添加回您的應用程序即可。該寶石包含從Rails 4核心中移除的清掃者和觀察者。
我希望能幫助你開始。
關於緩存失效我想我們回到了清理者角色。我不用在控制器中調用'Rails.cache.delete',而是使用外化gem中的清理器。我認爲在這種情況下它是有道理的,是嗎?謝謝你的回答:) – Happynoff
是的,清理者的角色很難擺脫,因爲這是一個工作緩存策略的先決條件之一;)我通常有一個生命週期類,如緩存失效,消息和與外部模型的交互。這樣你就可以擁有一個乾淨的控制器,一個小型的核心類,並在另一個監聽基類的類中保持你的無關行爲。從本質上來說,清掃者只是這些生命週期類別中的一個的特殊情況,他們作爲一種策略本身並沒有錯。 –
這就是爲什麼我對從Rails 4移除清除器感到陌生。我理解頁面/動作緩存是不好的,但由於低級緩存仍然需要清掃器或清掃器般的行爲,所以我沒有看到清除它們的要點:( – Happynoff