2015-09-27 96 views
-1

我剛開始在生產應用程序中使用緩存來加快速度。我已經閱讀了主要的Rails指南,各種博客,源碼本身等等。但就片段緩存而言,我的頭仍不清楚一件簡單的事情:Rails如何分段緩存工作?

當您在更新對象後銷燬緩存時,你只更新單個對象還是該類?我認爲只是單一的對象。

下面是一個例子:

<% @jobs.each do |job| %> 
    <% cache("jobs_index_table_environment_#{session[:merchant_id]}_job_#{job}") do %> 
    stuff 
    <% end %> 
<% end %> 

我在工作的索引頁使用上面的代碼。每一行呈現了一些信息的用戶想要的東西,一些CSS,點擊查看個人工作等

我在招聘類寫了這個(模型)

after_save do 
    Rails.cache.delete("jobs_index_table_environment_#{merchant_id}_job_#{self}") 
    end 

    after_destroy do 
    Rails.cache.delete("jobs_index_table_environment_#{merchant_id}_job_#{self}") 
    end 

我要在各個作業對象如果它們被更新或銷燬,則從緩存中銷燬,當然新創建的作業首次在頁面上彈出時會獲得自己的緩存關鍵字。

我不會用@jobs做俄羅斯娃娃的東西,因爲這是我的「神」對象,並且一直在變化。緩存幾乎不會有幫助,因爲該集合可能會在一分鐘內變形。

我的理解是正確的,在上面的視圖中,如果我把第25頁的作業渲染到第一頁,我會在緩存中獲得25個緩存中的對象,然後如果我只更改第一個,緩存的值將被銷燬,下一次加載作業頁面時,它將被重新緩存,而另外24個只會從緩存中提取?

+0

如果你閱讀你的終端輸出,你將會看到「寫入片段」或「讀取片段」的行。我認爲檢查出來會幫助你弄清楚你的代碼在做什麼。 – trosborn

回答

0

我也是一名新手,對片段緩存以及我剛剛遇到的一個非常相似的用例,所以我覺得我的(有限的)知識足夠新鮮,可以提供幫助。

Trosborn是正確的,您的終端會在您閱讀和寫入時突出顯示您的緩存中有多少「點擊」。它應該只在您更改對象時進行寫入。根據我上面所看到的,您的刪除只是刪除單個記錄。

不過,我認爲這是一個潛在的更簡單的做到這一點,這是通過ActiveRecord的對象到緩存中,如方式:

<% @jobs.each do |job| %> 
    <% cache(job) do %> 
    stuff 
    <% end %> 
<% end %> 

閱讀this post from DHH這是如何工作的。簡而言之,當AR對象傳遞到緩存時,密鑰不僅生成在型號名稱上,而且還生成idupdated_at字段。

當內存用完時,廢棄的碎片最終會從緩存中移出,因此您不必擔心刪除舊的緩存對象。

+0

在我的情況下,複雜性是'工作'在各種頁面上呈現,並且在實踐中,當我嘗試使用您指定的方法時,我獲得了CSS和所有其他關於customers/show的其他信息/該工作屬於特定的客戶。只給緩存AR對象是不夠的。 – notaceo

+0

你可以使用user'cache [current_user,job]'來補充緩存鍵,或者用一個特定於視圖的字符串:'cache [「這個視圖」current_user,job]「來爲這個鍵添加前綴。那會有訣竅嗎? –

+0

這是我在第一篇文章中已經完成的內容。問題是「高速緩存是否使所有25條記錄無效,或只是記錄發生了變化?」我爲各種頁面設置了正確的唯一鍵。 – notaceo