2012-12-11 57 views
9

觀察者和清掃器從Rails中移除4.酷。 但是,然後緩存和清除緩存的方法是什麼?清除Rails中緩存的正確方法是什麼?

我讀了關於俄羅斯娃娃緩存。它很好,但它只涉及視圖渲染緩存。它不會阻止數據庫被擊中。

例如:

<% cache @product do %> 
    Some HTML code here 
<% end %> 

您仍然需要從數據庫獲取@product,以獲取其cache_key。因此頁面或動作緩存仍然可以用來防止不必要的負載。

我可以使用一些超時清除緩存有時但如果記錄沒有改變什麼?

至少在清掃器方面你有控制權。什麼是/將是正確方式做緩存並清除它?

謝謝! :)

回答

8

歡迎的計算機科學兩個硬盤的問題之一,緩存失效:)

你將不得不到手動處理,因爲對當緩存的對象,不像緩存的視圖可以是簡單的邏輯從它顯示的對象派生而來,應該是無效的,這取決於應用程序和情況。

你爲此的方法是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核心中移除的清掃者和觀察者。

我希望能幫助你開始。

+0

關於緩存失效我想我們回到了清理者角色。我不用在控制器中調用'Rails.cache.delete',而是使用外化gem中的清理器。我認爲在這種情況下它是有道理的,是嗎?謝謝你的回答:) – Happynoff

+0

是的,清理者的角色很難擺脫,因爲這是一個工作緩存策略的先決條件之一;)我通常有一個生命週期類,如緩存失效,消息和與外部模型的交互。這樣你就可以擁有一個乾淨的控制器,一個小型的核心類,並在另一個監聽基類的類中保持你的無關行爲。從本質上來說,清掃者只是這些生命週期類別中的一個的特殊情況,他們作爲一種策略本身並沒有錯。 –

+0

這就是爲什麼我對從Rails 4移除清除器感到陌生。我理解頁面/動作緩存是不好的,但由於低級緩存仍然需要清掃器或清掃器般的行爲,所以我沒有看到清除它們的要點:( – Happynoff

相關問題