標籤:查詢 情境 back extension 方式 響應 java基礎 訪問 不同
1.為什麼使用緩衝
緩衝,在我們日常開發中是必不可少的一種解決效能問題的方法。簡單的說,cache 就是為了提升系統效能而開闢的一塊記憶體空間。
緩衝的主要作用是暫時在記憶體中儲存業務系統的資料處理結果,並且等待下次訪問使用。在日常開發的很多場合,由於受限於硬碟IO的效能或者我們自身業務系統的資料處理和擷取可能非常費時,當我們發現我們的系統這個資料請求量很大的時候,頻繁的IO和頻繁的邏輯處理會導致硬碟和CPU資源的瓶頸出現。緩衝的作用就是將這些來自不易的資料儲存在記憶體中,當有其他線程或者用戶端需要查詢相同的資料資源時,直接從緩衝的記憶體塊中返回資料,這樣不但可以提高系統的回應時間,同時也可以節省對這些資料的處理流程的資源消耗,整體上來說,系統效能會有大大的提升。
緩衝在很多系統和架構中都用廣泛的應用,例如:
1.CPU緩衝
2.作業系統緩衝
3.本機快取
4.分布式緩衝
5.HTTP緩衝
6.資料庫緩衝
等等,可以說在電腦和網路領域,緩衝無處不在。可以這麼說,只要有硬體效能不對等,涉及到網路傳輸的地方都會有緩衝的身影。
Guava Cache是一個全記憶體的本機快取實現,它提供了安全執行緒的實現機制。整體上來說Guava cache 是本機快取的不二之選,簡單易用,效能好。
Guava Cache有兩種建立方式:
1. cacheLoader
2. callable callback
通過這兩種方法建立的cache,和通常用map來緩衝的做法比,不同在於,這兩種方法都實現了一種邏輯——從緩衝中取key X的值,如果該值已經緩衝過了,則返回緩衝中的值,如果沒有緩衝過,可以通過某個方法來擷取這個值。但不同的在於cacheloader的定義比較寬泛,是針對整個cache定義的,可以認為是統一的根據key值load value的方法。而callable的方式較為靈活,允許你在get的時候指定。
2.Ehcache 與 Guava Cache 的區別
最近在做一些緩衝改造的情境,有如下一些經驗總結:
緩衝版本:
Ehcache:2.8.3
Guava:17.0
- Ehcache支援持久化到本地磁碟,Guava不可以;
- Ehcache有現成的叢集解決方案,Guava沒有。不過個人感覺比較雞肋,對JVM層級的緩衝來講太重了;
- Ehcache jar包龐大,Guava Cache只是Guava jar包中的工具之一,而且後者遠遠小於Ehcache;
- 兩種緩衝當緩衝到期或者沒有命中的時候都可以通過load介面重載資料,調用方式略有不同。兩者的主要區別是Ehcache的緩衝load的時候,允許使用者返回null,而Guava Cache則不允許返回為null,因為Guava Cache是根據value的值是否為null來判斷是否需要load,所以不允許返回為null,但是使用的時候可以使用Null 物件替換。不允許返回null是一個很好的考慮;
- Ehcache有記憶體佔用大小統計,Guava Cache沒有,需要自己開發。
什麼時候適用Ehcache、什麼時候適用Guava cache?
首先,兩者都是很成熟的JVM層級緩衝,所以在絕大多數情況都是可以滿足要求的。
適用Ehcache的情況
- 需要持久化持久化。使用持久化功能需要,緩衝穩定,以免持久化的資料不準確影響結果。
- 有叢集解決方案。
適用Guava cache的情況
Guava cache說簡單點就是一個支援LRU的ConCurrentHashMap,它沒有Ehcache那麼多的各種特性,只是提供了增、刪、改、查、重新整理規則和時效規則設定等最基本的元素。做一個jar包中的一個功能之一,Guava cache極度簡潔並能滿足覺大部分人的要求。
總結
Ehcache有著全面的緩衝特性,但是略重。Guava cache有最基本的緩衝特性,很輕。大家根據具體情況選擇使用。
java基礎--extension package guava(2) cache