最常用的cache應該是頁面的片段緩存
和底層緩存
。
如果要使用片段緩存,則需要在
/config/environments/development.rb
中打開配置:
config.action_controller.perform_caching = true
生產環境默認是打開的。
一般在views
使用,例如:
<% 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 %>
cache
方法表示:如果Product.latest
沒有更新,則直接獲取緩存中的store
片段,顯示在頁面中。并且在store
片段中,如果product
也沒有更新,也是直接獲取緩存中的entry
片段顯示在頁面中。
一旦Product.latest
有更新,則expires
(過期)store
中的緩存,并且在后端進行查詢后,獲得Product.latest
,再緩存到store
中去。同理entry
緩存也是一樣的原理。
這樣就可以對一些更新不頻繁的片段頁面(比如頁面中的本周熱度最高的產品列表)進行緩存處理,提高這個片段頁面的讀取速度,同時一旦片段頁面中發生變化,也能及時的更新并將更新后的內容緩存起來。
當然還有很多參數可以設定,也有一些其它方法可以使用。看源碼就行了。
- 底層緩存
如果不想緩存視圖片段,只想緩存特定的值或者查詢結果,則可以用底層緩存
ActiveSupport::Cache::Store
感覺一般使用在models
中,比如:
def random_users
Rails.cache.fetch("random_users", expires_in: 1.day) do
User.order('RAND()').limit(2).to_a
end
end
上面定義了一個方法random_users
,該方法返回一個數組,先隨機排序后,再獲得前兩個user
,并且在1天之內該方法的返回值不會變化。
值得注意的是cache中的查詢后面有一個
to_a
方法將查詢的結果轉換成了數組存在cache中。
這是因為如果不加to_a
,那么cache中存的是一個ActiveRecord::Relation
,而每次需要數據的時候,才會去查詢,這樣,每次查詢出來的結果肯定不一樣。所以需要轉換成數組,將數據存放在cache中。
參考這個帖子的回復
數據緩存查詢
避免N + 1
查詢:使用Eager Loading Associations
。可以看這個后記
cache
對我而言是一個復雜的機制,需要不斷的理解熟悉。希望以后可以正確并熟練的使用cache
。