2014-04-21 68 views
0

我正在使用Rails4編寫敏捷Web開發書,我剛剛閱讀了關於緩存視圖各部分以避免壓倒數據庫的(第一部分)部分。 我當然在開發環境的配置中將緩存選項設置爲true。Rails4在敏捷Web開發中使用Rails4

問題是緩存似乎沒有工作。 這裏是我的應用程序/視圖/存儲/ index.html.erb文件,酷似書中給出的,啓用緩存:

<% if notice %> 
    <p id="notice"><%= notice %></p> 
<% end %> 

<h1>Your Pragmatic Catalog</h1> 

<% cache ['store', Product.latest] do %> 
    <% @products.each do |product| %> 
    <% cache ['entry', product] do %> 
     <div class="entry"> 
     <%= image_tag(product.image_url) %> 
     <h3><%= product.title %></h3> 
     <%= sanitize(product.description) %> 
     <div class="price_line"> 
      <span class="price"><%= number_to_currency(product.price) %></span> 
     </div> 
     </div> 
    <% end %> 
    <% end %> 
<% end %> 

這裏是Rails服務器記錄,充分顯示出DATABSE在多次訪問(雖然行提到緩存):http://pastebin.com/v2jGiHKL

這裏是我的應用程序/視圖/存儲/ index.html.erb文件,其中我嘗試別的東西緩存:

<% if notice %> 
    <p id="notice"><%= notice %></p> 
<% end %> 

<h1>Your Pragmatic Catalog</h1> 

<% cache('caching') do %> 
    <% @products.each do |product| %> 
     <div class="entry"> 
     <%= image_tag(product.image_url) %> 
     <h3><%= product.title %></h3> 
     <%= sanitize(product.description) %> 
     <div class="price_line"> 
      <span class="price"><%= number_to_currency(product.price) %></span> 
     </div> 
     </div> 
    <% end %> 
<% end %> 

這裏是相應的日誌,顯示出cach ing是成功的(因爲數據庫沒有被查詢):http://pastebin.com/ZTk9A9RA

有人可以解釋爲什麼一個似乎工作,而不是其他,或者第一個應該如何工作?謝謝:)

請注意,在本書中,它說,啓用緩存後,如果更改是在緩存塊內進行的,則重新加載商店頁面不應顯示store/index.html.erb的新部分;但它確實在兩種情況下。任何想法 ?

+0

在您的第一個日誌中,只有一個「GET」/「'。你也可以向我們展示控制器嗎? –

+0

是不是因爲我在第二種情況下只訪問過一次頁面,在第一種情況下是兩次?(在這種情況下,你的意思是相反的,對吧?) 總之,這裏是我的控制器: http://pastebin.com/J6dpxe7D 而 http://pastebin.com/aKTUFX82 – GraawrImaTiger

回答

1

您傳遞給cache API的參數是緩存密鑰。該密鑰的散列函數是緩存片段將存儲在哪裏以及它將被查找的位置。

在您的代碼(cache('caching'))中,緩存鍵是硬編碼的,並且永遠不會更改,因此,除非緩存失效(無論是在代碼中手動還是TTL已經通過) - 將發送相同的片段給客戶。

在書(cache ['store', Product.latest])的代碼中,關鍵取決於最新產品。這意味着如果最新的產品發生變化(另一個產品被添加或更新) - 下一次調用將自動'知道'不從緩存中取出頁面,而是重新創建緩存。

什麼是日誌顯示:

[1m[35mProduct Load (0.3ms)[0m SELECT "products".* FROM "products" ORDER BY "products"."updated_at" DESC LIMIT 1 

實際上是Product.latest結果,Product.all。總結 - 兩個代碼片段都被緩存,但在示例代碼中,(小)命中數據庫以驗證緩存的有效性,即頁面是否被緩存。

如果您自己使緩存無效,則可以保留代碼的硬編碼版本,但如果不是,則最好考慮失效方案,無論它是否像示例代碼所示或其他內容。

+0

好吧,我明白了,非常感謝:) 因此,在Rails中,更常見的做法是每次在DB中更改重要內容時手動使緩存失效,還是讓緩存的片段使用動態密鑰處理它們會更好? – GraawrImaTiger

+0

我認爲這裏有一些變量,這取決於用例(顯示_latest_數據與數據庫可能承受多少負載的關鍵點),但我相信,除非您對數據庫非常擔心,否則讓這個工作可能會更簡單。 –

+0

好了,再次感謝。 – GraawrImaTiger