緩存在項目中的應用

一個項目開發完成後,我們都會進行壓力測試以驗證非功能性需求是否滿足,如果性能無法達到要求,我們一般會從代碼、數據庫、集羣、緩存等一些方面對系統進行優化。其中的緩存,絕對是對項目性能進行優化的一個重點。
所謂緩存,就是在系統內存區中開闢出一塊單獨的內存區域,把要使用的對象預先加載到這塊內存區域中(或將使用過的對象放回到這塊內存區域中)。如果應用需要對象時,系統先在緩存中查找要找的東西是否存在,如果沒有找到,再從其它地方(如:數據庫或物理磁盤)加載,顯然,緩存是通過內存訪問的高速性,有效地提升了整個系統的性能。
下面,我們通過一個具體的項目,向你講述voa英語復讀網 (www.fudu365.com)中緩存的使用,在復讀網開發過程中,我們主要從以下幾個方面考慮,來提升系統的高併發響應的:
一、系統持久層採用hibernate開發,我們自然想到了hibernate緩存。Hibernate緩存分爲session級緩存與sessionFactory級緩存,而session級緩存對應用程序來說是透明的, session的生命週期比較短, session級緩存對我們的幫助不是太大。sessionFactory級緩是也是二級緩存,我們一般會使用ehcache、oscache等開源緩存框架實現。系統會在啓動時將變化機率較小的數據,比如:數據字典等,預先加載出來放到二級緩存,以供程序使用。並且,我們通過對業務的跟蹤,找出執行頻度非常高的查詢(比如:按類別對voa文章的查詢),我們將這些查詢放入hibernate的查詢緩存,以提高性能。
二、對數據庫存連接的緩存,即連接池。因爲hibernate的一個session,就意味着一個數據庫connection,而創建數據庫連接又屬於昂貴操作,因此,我們都會用數據庫連接池來緩存已經得到的邊接。項目中一般會採用dbcp或proxool等連接池框架,在這裏,我建議大家採用proxool,它在性能及穩定性等方面均優於dbcp,而且,dbcp對mysql連接8小時過期問題非常地煩人。
三、Squid緩存頁面對象,你可以從http://www.squid-cache.org/ 下載該緩存框架。復讀網對衆多的靜態頁面,全部做了緩存處理。
四、採用分佈式緩存,在集羣環境中,對單詞翻譯結果進行緩存,該緩存採用Memcached實現,這也是是根據復讀網需求決定的。
在復讀網中的英語在線復讀機中,用戶將鼠標移動到某個單詞時,系統將出現該單詞的發音、解釋,由於當時我們沒有找到翻譯詞庫文件,因此,項目組決定從第三方翻譯網站查詢單詞解釋,將得到結果生成爲WordTranslate對象,存入數據庫存,同時放到memcached緩存中方便下次查詢。當有另一個用戶查詢單詞解釋時,我們將首先從memchched中查找,如果沒有找到,再查詢數據庫存返回對象,同時放入緩存,如果沒有找到,再去第三方翻譯網站查詢。
關於Memcached的使用,請參閱我的另一篇文章。
總的來說,緩存對提高系統性能至關重要,緩存什麼對象,採用什麼樣的緩存策略,都要根據不同的需求而定,不能一概而論,大家要根據不同的項目需求,選擇最佳的緩存方案。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章