片段快取(二,三)已經實現完整了,但好像還沒有提到如何在專案中進行實際應用,那麼現在就來談一談這方面。之前也有朋友提出,這個片段快取到底省下的是什麼啊?好像資料都是在controller中獲取的,檢視的生成不會帶來多少開銷啊,難道節省的只是拼接html字串的時間嗎?這其實就涉及到片段快取在實際專案中該如何使用的問題了。
上週日的幻燈片中我提到ruby on rails中的fragment caching一般是這樣使用的:
def list
unless read_fragment(:action => 'list' )
@articles = article.find_recent
endendend
以及它的檢視模板:
<% cache do %>以上是乙個controller和乙個名為list的action方法,再list方法中回去檢查片段快取是否存在,如果不存在才去載入@articles欄位。檢視模板中的邏輯也類似,如果快取不存在才去訪問@article欄位。這樣,讀取@acticle的開銷便節省下來了。在我之前公布的asp.net mvc片段快取實現中,還無法在controller中操作快取,近期打算加上這方面的功能。<% end %>
可是這樣的做法可能會產生乙個問題:在併發情況高的環境下,可能檢視會訪問到沒有初始化的@articles欄位。因為在action方法中快取還沒有過期,但是就在正式生成檢視內容,快取過期了——於是就引起了錯誤。不過,其實我在想到「片段快取」時,第一反應並不是這種做法,而是使用「延遲載入」。
使用延遲載入,也就是說在action方法中雖然不會載入某個字段,但是還是會給這個字段「打乙個樁(stub)」。如果檢視中不妨問這個字段自然無妨,但在需要訪問的話,也可以正常獲取到資料。於是這種做法既可以省下開銷,又不會出現問題。
不過使用延遲載入並非完全沒有代價,它要求資源**的時機不能太早。據我所知,有些朋友會使用action filter,在onactionexecuted時**所有資源(如資料庫連線),這樣在檢視中自然無法獲取資料了。因此,如果您使用延遲載入,請務必在onresultexecuted時**資源。
那麼,我們該如何使用延遲載入呢?最容易的做法自然是稍微修改一下你的model,保持介面不變即可。不過現在您也可以關注一下eazy類庫。
eazy類庫是我前一段時間設想中的「延遲輔助類庫」,名字**於easy + lazy,目前託管在codeplex中。有了這個類庫的幫助,您就無需對自己的類庫「小動干戈」了。於是,您就可以在action方法使用這樣的**來設定欄位的延遲功能:
publicactionresult list()
lazybuilder.create方法會建立model型別的例項,然後使用setup方法可以為某個屬性指定乙個委託,而這個委託便會在第一次訪問這個屬性時執行。lazybuilder的實現機制非常清晰,只是使用emit在執行時動態建立目標型別的子類而已。例如model型別:
public classmodel
}
便會為它生成如下的子類:
public classmodel$lazyproxy : model
return base.articles;
}set
}public
func
> articles$lazyloader = null;
}
這段寫法是我認為實現延遲載入最理想的方式了,最重要的是它保留了屬性原有的邏輯,只是在載入時機上做了文章。此外,在不需要延遲載入的情況下,屬性的行為也不會改變。
不過eazy專案其實才建立了2天,目前只能通過指定泛型型別來構造物件,這意味著這個型別必須有預設的建構函式。根據我的設想,它以後還會支援其他的構造方式,例如:
var builder = lazybuilder.create(() => newmodel(1, 2) );
builder.setup(m => m.articles, () => article.findrecent());
var model = builder.instance;
由於完全使用emit,因此不會帶來反射的開銷,效能是很有保障的。例如lazybuilder.create的消耗和new model()相比也就是多了些方法呼叫而已。目前eazy專案還比較簡陋,例如**中不會丟擲恰當的異常,單元測試也不夠完整。此外,我還在考慮是否要對唯讀屬性或介面提供延遲載入的支援。
當然,如果您有什麼想法也請告訴我,這裡先謝過了。
Mybatis的延遲載入和快取
1.mybatis中的延遲載入,也稱為懶載入,是指在進行關聯查詢時,按照設定延遲載入規則推遲對關聯物件的select查詢。延遲載入可以有效的減少資料庫壓力。注意 mybatis的延遲載入只是對關聯物件的查詢有延遲設定,對於主載入物件都是直接執行查詢語句的。2.mybatis根據對關聯物件查詢的sel...
nginx的快取設定以及實際應用
nginx的快取設定以及實際應用 在實際生產中,一般可支援3萬 4萬併發連線數!nginx配置快取的優點 可以在一定程度上,減少伺服器的處理請求壓力。比如對一些,css或js做一些快取,那麼在每次重新整理瀏覽器的時候,就不會重新請求了,而是從快取裡面讀取。這樣就可以減輕伺服器的壓力。nginx可配置...
bios硬碟模式的選取及實際應用
如果你對bios了解的話,那麼你應該知道硬碟模式選項,對於該選項我們應該如何選取呢?實際案例 伺服器某些時候斷電啟動或重啟找不到硬碟,但開機自檢及bios都可以看到硬碟確確實實是存在的,但為什麼引導時卻找不到引導介質呢?這個問題困擾了我好久,現在基本上可以確定的是ahci模式對sata的介面支援不是...