java中要用到緩存的地方很多,首當其沖的就是持久層緩存,針對持久層談一下:
要實作java緩存有很多種方式,最簡單的無非就是static HashMap,這個顯然是基于記憶體緩存,一個map就可以搞定引用對象的緩存,最簡單也最不實用,首要的問題就是儲存對象的有效性以及周期無法控制,這樣很容易就導緻記憶體急劇上升,周期無法控制可以采用SoftReference,WeakReference,PhantomReference這三種對象來執行(看了Ibatis的緩存機制才發現JDK居然還提供了PhantomReference這玩意兒,得惡補基礎啊),這三種都是弱引用,差別在于強度不同,至于弱引用概念個人了解就是對象的生命周期與JVM挂鈎,JVM記憶體不夠了就回收,這樣能很好的控制OutOfMemoryError 異常。
以上就是記憶體級别的緩存,但是很多情況下是滿足不了企業應用的,大資料量的緩存肯定還是要儲存到檔案,這個時候光用JDK來實作就比較複雜了,這裡當然要用到第三方開源架構來實作了,常用的有Oscache,Ehcache,Jcache,Jbosscache等等很多,推薦還是Ehcache與Oscache,hibernate采用了Ehcache做為其緩存機制預設實作,Oscache沒深入研究,但是Ibatis推薦的緩存為這個。
為什麼要緩存,無非就是節省通路時間已經大并發量帶來的通路上資源的消耗,這個資源有軟資源和硬資源,做java的幾乎每天都在有意識或者無意識的跟緩存打交道,最常見的緩存,Connection Pool,還有IOC其實也算一個。
緩存用的好能提高性能,用的不好反而會急劇的降低産品的性能,就拿hibernate來說,hibernate性能肯定不如jdbc,但是緩存用的好的話增删改查的性能相差無幾,hibernate緩存最核心的部分個人覺得在于對象的有效性,緩存的命中率越高意味着性能越高,命中率跟緩存對象的有效性息息相關,如何保證對象有效這個很難,也很有搞頭,如果緩存中對象有效性很差,其性能甚至會低于不用緩存,因為緩存本身就會耗性能跟資源,緩存的對象很多都很快失效了無疑得不償失,還有緩存的深度也有講究,這個深度是指從頁面到資料庫,顯然是頁面緩存的性能最好,因為調用頁面緩存消耗的資源最少,當然現實中是不可能有太多頁面緩存的。
個人覺得緩存是把雙刃劍,一定要根據緩存的特征和業務場景來選擇使用才能發揮其最大優勢。