`

Rails Cache 效率上的問題

阅读更多
Fragement Cache 是大家常用的Rails 內建 Cache 機制,不過昨天看到石鍋拌飯先生寫的rails缓存机制的几个问题,裡面提到一些 Fragement Cache 的問題,這裡做一下筆記。




1. read_fragment 實做方式效率不佳

actionpack/lib/action_controller/caching.rb 裡面,read_fragment 假設是使用 file_store 的話,實做方式不佳
def read(name, options = nil) #:nodoc:
File.open(real_file_path(name), 'rb') { |f| f.read } rescue nil
end
每次判斷 fragment 都得 open file 一次,的確會損耗效率。解決方式是用 File.exist? 來判斷即可。

2. expire_fragment 使用 regular expression 效率不佳

不算問題啦,假設 expire_fragment 使用 regular expression ,根據內建的實做方式,他會一個一個目錄下去用 regular expression ,然後 regular expression 通常執行速度不佳,所以就....

解決方式有兩個,第一個就是不要在 expire_fragment 使用 regular expression,另外就是使用 backend script 來 expire cache 即可。

3. expire_cache 的時間點

簡單講就是 controller read_fragment 的到 cache ,但是當 render 的時候卻剛剛好被 expire 掉了,就會出現 nil object error 。因為發生機率比較低,解決方式只能說視情況而定。

當然也可以照著原作者的講法,在 view 當中判斷 Model obj 是不是存在,不過這個作法就比較 dirty。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics