<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    緩存漫談

    緩存是在提升系統響應時常用的一種技術,在我之前的blog中也提及過好幾次這部分的技術,今天還是想從緩存涉及的一些方面再次的去談談,在系統緩存上通常采用的是有頁面緩存、處理緩存和數據緩存這三種具體的類別,應該說這三種緩存在實現上還是稍有不同,盡管底層的緩存實現是一樣的。
    頁面緩存
    頁面緩存是指對頁面中的內容片斷進行緩存的方案。比如頁面中有一個部分是顯示欄目中的內容的,那么就可以緩存這個部分,在進行第二次請求的時候就直接從緩存中取出這部分的內容(其實就是這部分的html了),這種情況下,緩存的作用其實非常明顯,在典型的action+service+dao這樣的結構中,在采用頁面緩存后就意味著不需要經過action、service、dao這些層次的處理了,而是直接就返回了,對于系統響應速度的提升來說是非常明顯的。
    頁面緩存通常采用oscache來進行實現,oscache提供了一個jsp tag,可通過這個tag來包含需要緩存的內容部分,當然,緩存的這個內容部分需要有對服務器的請求或邏輯計算等的,可想而知,去緩存一段靜態html是沒有意義的。
    其次需要定義緩存的這段內容的key,例如我們要去緩存頁面中某個欄目的某頁的內容,對于這段內容而言唯一的key就是欄目ID以及當前頁數,這樣就組成了這段緩存的key了,其實這個部分看起來好像是很簡單,但有些時候會很麻煩,要仔細的想清楚這段內容的唯一的標識的key到底是什么,^_^,通常的做法其實可以從action中需要獲取的參數或service接口的參數來決定....
    頁面緩存中還需要做的一個步驟就是通知緩存需要更新,頁面緩存和其他緩存稍有不同,需要告訴它,這個時候不能再使用緩存中的內容了,需要從后臺再重新獲取來生成新的緩存內容,這個其實很簡單,因為很難在后臺發生變化的時候自己來更新緩存的內容,只能是去通知它,然后讓它再次發起請求來生成新的內容放入緩存中。
    頁面的緩存的使用對于系統的響應速度確實會有很大的提升,在實現頁面緩存時最麻煩的主要是緩存的key的定義以及緩存更新的通知,緩存key的定義這個自然框架是沒法解決的,不過緩存更新的通知其實在框架中可以考慮一種通知模型的,^_^,就像事件通知那樣........在實際的項目中,可以自己去實現一個這樣的通知模型或者就是簡單的采用單例方式來標識某個key是否需要更新。
    頁面緩存在實際的項目中使用非常的多。
    處理緩存
    處理緩存是指對于action、service、dao或者系統層次中的某方法進行緩存,說直接點,就是對某個類的某個方法的結果做緩存,這樣在下次進行完全相同的請求的時候就可以直接取緩存了,這種響應速度的提升也是非常明顯的。
    處理緩存在現在的情況下其實采用任務的緩存工具包都可以實現,如oscache、ehcache、jbosscache等,但目前還沒有處理緩存框架的出現,這個和處理緩存是否應該存在的意義也是有關系的,處理緩存框架要做到的其實就像攔截一樣的方式,和oscache tag類似。
    同樣,處理緩存的麻煩也在于怎么樣去定義這個key,很多情況下可以根據方法的輸入作為key,方法的輸出作為key的值,但也會有其他一些復雜的情況,這個時候定義key就會變得復雜些了。
    處理緩存同樣有通知更新緩存的情況,和頁面緩存基本是一樣的。
    應該說,處理緩存和頁面緩存非常的相似,從實現上來說基本是完全一致的,在使用上來講處理緩存使用的好像不多。
    數據緩存
    數據緩存估計大家都很熟悉,就是對系統的數據進行緩存的方式,典型的就是Hibernate的一級、二級數據緩存。
    數據緩存在實現上如果是用hibernate的話更多的是直接使用hibernate的一級、二級以及查詢緩存,如果自己要實現的話可以去參考hibernate的實現機制。
    數據緩存的key在一級、二級緩存中采用的都是數據的標識鍵的值的方式,查詢緩存采用的是查詢參數、查詢語句的方式。
    數據緩存的更新則是hibernate在進行存儲時直接更新緩存的內容,而對于查詢緩存則是采用全部直接清除的方式,這樣在下次進行查詢時自然會重新去查詢,^_^,大家可能會想,為什么頁面緩存和處理緩存不采用這樣的方式來實現緩存的更新,稍微想想就知道了,在后臺發生改變的時候其實是不知道需要移除哪些key的,所以hibernate為了避免這個麻煩,采用的就是當數據一旦發生改變的時候就清除全部的查詢緩存,而不是只去清除相關的緩存,其實這里可以采用一種訂閱式的模型,呵呵,當然,也增加了框架的復雜度。
    數據緩存使用的應該是最多的,效果也是很明顯的。

    以上三種緩存是目前緩存實現時通常碰到的三種狀況,里面按使用的多少來排序應該是:數據緩存、頁面緩存和處理緩存;實現的難度上從難到易的順序應該是:處理緩存、頁面緩存、數據緩存;對于系統響應速度提升的效果來說從最好到好的順序應該是:頁面緩存、處理緩存、數據緩存。

    posted on 2006-06-02 23:38 BlueDavy 閱讀(4406) 評論(9)  編輯  收藏 所屬分類: Java

    評論

    # re: 緩存漫談 2006-06-03 12:03 zkjbeyond

    hibernate雖然提供比較完善的一級、二級數據緩存機制。但對于開發人員使用起來很不方便,也比較復雜。

    一級緩存也就是session級別的,感覺作用很小,基本上命中率不高。因為一個session執行相同查詢幾率較小。
    而二級緩存也只能在 session.load,session.iterate,lazy load中才用到,可一般人代碼直接用 session.list();查詢。

    所以一般項目,我都把這類緩存放到邏輯層,也是“處理緩存”,用spring+ehcache效果不錯。

      回復  更多評論   

    # re: 緩存漫談 2006-06-03 13:04 C[ETI]O@quaffsoft

    @zkjbeyond

    有沒有可能對DetachedCriteria這樣的查詢做緩存?  回復  更多評論   

    # re: 緩存漫談 2006-06-03 13:28 BlueDavy

    @zkejbeyond
    自己做處理緩存你是采用攔截的方式還是什么別的方式呢?

    @quaffsoft
    應該是可以的吧,hibernate做查詢緩存是根據查詢的參數、語句等來做的,不過我對DetachedCriteria那種方式不熟......無法判斷  回復  更多評論   

    # re: 緩存漫談 2006-06-03 13:30 BlueDavy

    其實Hibernate的一級、二級緩存的作用還是很明顯的,只要熟悉hibernate對于一級、二級緩存的處理機制就OK了  回復  更多評論   

    # re: 緩存漫談 2006-06-03 15:36 zkjbeyond

    @C[ETI]O@quaffsoft

    其實我自從hibernate2.17后項目中就沒用過了。

    1 相信很多人和我一樣,用hibernate,也用spring來管理,當用spring,hibernateSupport時,很多hibernate Session的原生方法都不方便訪問,當然可以用inner class實現。我除了分頁用inner class外,一般直接用spring方法。
    2 很多mis系統,表字段用了數據字典,如果用hiberbate處理many to one關系是很惡心的事(有個同事這樣干過)。如果PO/VO得到的是字典值,如 address1="33012323",而它代表**市**區,可能在業務層需要對VO翻譯一下,那么你在dao做cache,還不如在logic層cache呢。

    所以我一般不用hibernate cache .用spring AOP方式 做 Cache.

    http://www.springframework.org/docs/api/org/springframework/cache/ehcache/package-summary.html
    http://www.onthoo.com/blog/programming/2004/09/spring-aop-cache.html
    http://opensource.atlassian.com/confluence/spring/display/DISC/AOP+Cache

    其實就是上面例子擴展了更新通知。

      回復  更多評論   

    # re: 緩存漫談 2006-06-03 16:52 guitarpoet

    @BlueDavy

    Hibernate的二級緩存機制最好還是不要用,因為一個項目不可能保證所有的數據庫訪問全部交由Hibernate進行處理,而越過Hibernate 訪問數據庫的方式很容易就造成了Hibernate的緩存數據不一致的問題。

    另外對于Hibernate的內置緩存是不支持集群的,即使采用oscache這種支持集群的Cache,你也會發現,由于緩存本身實現的特殊性,服務器端壓力的增加是很多的,也就是說,如果使用不當,對服務器端是壓力的增大而不是減少。

    而使用得當的必須是對Hibernate熟悉的并且對JavaEE技術和服務端技術非常了解的開發人員,對于業務開發人員而言,這種要求過高了。

    如同HttpSession的實現也是爭論不休一樣,Hibernate二級緩存能夠給你帶來的優點不多,但是給你的系統帶來的隱患卻不少,我的建議是,盡量不要用。只有在非常需要的情況下慎用。

    如果你有項目開發的經驗,那么你就會明白,其實系統的更多的瓶頸是在于基本的編程錯誤的設計和技術的錯誤使用方式,對于二級緩存這種只是需求頻率不足10%的需要考慮的問題,大可在系統出現致命的瓶頸問題時再考慮

    至于你說的處理緩存和頁面緩存,他們的最應該出現的地方應該是,耗費資源的幾乎不發生改變對象的構建(比如一些圖形、PDF或者需要通過腳本解析、遠程服務調用而獲得的Java對象),這些東西由于構造它們非常耗費服務器資源,而重復構造更是服務器資源的浪費,那么緩存它們是必不可少的

    但是,別忘了,對于緩存而言,集群內部同步和內部對象失效和刷新機制也不是什么好玩的東西。想當然的認為使用它就會減輕系統的負擔的想法是不負責任的。必須在壓力測試的前提下進行試驗。

    所以,我認為:除了耗費資源的幾乎不發生改變對象之外,其他所有的緩存(尤其是Hibernate的查詢緩存)都應該經過試驗后慎用,最好是不用,只在出現性能瓶頸的時候通過AOP的形式加入進去,我認為Spring框架就比較推薦這種方式   回復  更多評論   

    # re: 緩存漫談 2006-06-03 20:34 BlueDavy

    @guitarpoet
    ^_^,其實數據緩存的方式自然不會有頁面緩存和處理緩存帶來那么明顯的提升,不過在很多場合下效果還是不錯的,當然,如果系統不是完全用Hibernate的話,自然是不能用Hibernate的二級緩存。
    對于頁面緩存和處理緩存,它們的效果是很明顯的,在我以前的一個項目中,在采用頁面緩存后整體頁面的刷新速度從10秒左右提升到了1秒以內...
    緩存在集群下的測試是要特別注意的...

    緩存在性能提升的時候是很重要的一種手段,很多時候通過程序去提高效率的方式不如采用簡單的緩存策略去實現,畢竟硬件的代價比研發付出的成本低很多。

    Spring AOP實現cache的方式一直想嘗試的...處理緩存對于系統效率的提升肯定是非常明顯的...
      回復  更多評論   

    # re: 緩存漫談 2006-06-03 21:35 BlueDavy

    @zjkbeyond
    看了下spring aop cache的幾篇文章,確實不錯,不過要是那個緩存框架完整就好了,^_^,其實就是要加個通知模型而已..  回復  更多評論   

    # re: 緩存漫談 2007-07-27 17:21 sitinspring

    好文章,做個記號,有空細看.  回復  更多評論   

    公告

     









    feedsky
    抓蝦
    google reader
    鮮果

    導航

    <2007年7月>
    24252627282930
    1234567
    891011121314
    15161718192021
    22232425262728
    2930311234

    統計

    隨筆分類

    隨筆檔案

    文章檔案

    Blogger's

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 一区二区三区免费视频观看| 日本亚洲欧美色视频在线播放| 四虎影视精品永久免费网站| 亚洲AV色吊丝无码| aa午夜免费剧场| 免费精品国产自产拍在| 久久亚洲AV无码精品色午夜麻豆| 99re在线精品视频免费| 亚洲成AV人网址| 一级特级女人18毛片免费视频| 亚洲精品岛国片在线观看| 免费人成网站永久| 成人免费视频试看120秒| 亚洲伊人久久精品影院| 中文字幕无码毛片免费看| 啊灬啊灬别停啊灬用力啊免费看| 国产偷国产偷亚洲高清在线| 亚洲成年人免费网站| 亚洲jjzzjjzz在线观看| 天天看免费高清影视| 亚洲春色另类小说| 久久久www成人免费毛片| 久久精品国产亚洲AV香蕉| 91福利免费网站在线观看| 亚洲AV无码国产丝袜在线观看| 本道天堂成在人线av无码免费| 亚洲AV中文无码乱人伦下载 | 亚洲av永久无码精品秋霞电影影院 | 黄网站色在线视频免费观看| 日本亚洲色大成网站www久久 | 亚洲国产成人精品无码区在线观看| 国产精成人品日日拍夜夜免费| 亚洲精品永久www忘忧草| 夭天干天天做天天免费看| eeuss在线兵区免费观看| 亚洲视频一区在线观看| 午夜神器成在线人成在线人免费| 一级中文字幕乱码免费| 亚洲综合色丁香麻豆| 亚洲?V乱码久久精品蜜桃| 亚洲色成人网站WWW永久四虎|