分佈式緩存的學習(memcached,JBoss Cache)

一、分佈式緩存
memcached,JBoss Cache,SwarmCache,OSCache,JCS,EHCache等開源項目的關注率比較高。
memcached和其他幾個不同,JBoss Cache的特點是,功能大而全,可算是Cache集大成者,幾乎什麼都支持。
其餘的幾個都很輕量。SwarmCache,OSCache,JCS支持Cluster。EHCache不支持Cluste

Cache的基本特性。
1. 時間記錄
數據進入Cache的時間。
2. timeout過期時間
Cache裏面的數據多久過期
3. Eviction Policy 清除策略
Cache滿了之後,根據什麼策略,應該清除哪些數據。
比如,最不經常被訪問的數據,最久沒有訪問到的數據。
4. 命中率
Cache的數據被選中的比率
5. 分級Cache
有些Cache有分級的概念。比如,幾乎所有的Cache都支持Region分區的概念。可以指定某一類的數據存放在特定的Region裏面。JBoss Cache可以支持更多的級別。
6. 分佈式Cache
分佈在不同計算機上的Cache
7. 鎖,事務,數據同步
一些Cache提供了完善的鎖,事務支持。
以上特性,大部分Cache都有相應的API支持。這些API很直觀,也很簡單

1)memcached
是一個C/S結構的遠程Cache實現,主要使用在Shared Nothing Architecture中.
不同計算機上的應用程序通過一個IP地址來訪問memcahced Server。
同一個key對應的數據,只存在於一臺memcached server的一份內存中.
memcached server也可以部署在多臺計算機上。Memcached通過key的hashcode來判斷從哪臺memcached server上存取數據數據。我們可以看到,同一個key對應的數據,還是隻存在於一臺memcached server的一份內存中.所以,memcached不存在數據同步的問題.
memcached由於是遠程Cache,要求放到Cache的Key和Value都是Serializable.
2)JBoss Cache 
Cluster Cache的數據同步,需要網絡通信,這就要求放到Cache的數據是Serializable。
JBoss Cache提出了POJO(Plain Ordinary Java Objects的縮寫,它通指沒有使用Entity Beans的普通java對象,可以把POJO作爲支持業務邏輯的協助類,POJO有一些private的參數作爲對象的屬性。然後針對每個參數定義了get和set方法作爲訪問的接口,也被稱爲Data對象) Cache的概念,意思是數據不是Serializable,一樣能夠在Cluster中同步
JBoss POJO Cache通過AOP機制(Aspect Oriented Programming 面向切面編程,也叫面向方面編程,是目前軟件開發中的一個熱點,也是Spring框架中的一個重要內容。利用AOP可以對業務邏輯的各個部分進行隔離,從而使得業務邏輯各部分之間的耦合度降低,提高程序的可重用性,同時提高了開發的效率),支持對象同步,支持對象屬性的同步,支持關聯對象的Cache,支持繼承,集合,Query,並支持不同級別的事務,儼然一個小型內存數據庫級別的數據存儲系統。 
JBoss POJO Cache的對象管理類似Hibernate,JDO,JPA等ORM工具,同樣有Detach和Attach的概念.Attach就是put,把對象放入到Cache中。Detach就是remove,把對象從Cache中刪除。put的時候,放進去的是個乾乾淨淨的POJO,出來的時候,就是Enhanced Object,裏面夾雜了很多Interceptor代碼,監聽對象的方法。


1)Cache的操作通常有4個,get,put,remove,clear。
對 於Cluster Cache來說,讀操作(get)肯定是Local方法,只需要從本臺計算機內存中獲取數據。Remove/clear兩個寫操作,肯定是Remote方 法,需要和Cluster其他計算機進行同步。Put這個寫方法,可以是Local,也可以是Remote的。 Local Put比起Remote Put的優勢很明顯,所以,通常的Cluster Cache都採用Local Put的策略。
2)Memcached可以看作是Center Cache。
Center Cache和Cluster Cache的特性比較如下:
Center Cache沒有同步問題,所以,remove/clear的時候,比較有優勢,不需要把通知發送到好幾個計算機上。
但是,Center Cache的所有操作,get/put/remove/clear都是Remote操作。而Cluster Cache的get/put都是Local操作,所以,Cluster Cache在get/put操作上具有優勢。Local get/put在關聯對象的組裝和分拆方面,優勢比較明顯。 
3)Cache可以用在任何地方,比如,頁面緩存。但Cache的最常用場景是用在ORM(對象關係映射,提供了概念性的、易於理解的模型化數據的方法)中,比如,Hibernate(一個開放源代碼的對象關係映射框架,它對JDBC進行了非常輕量級的對象封裝,使得Java程序員可以隨心所欲的使用對象編程思維來操縱數據庫),JDO(Java Data Object,是Java對象持久化的新的規範,也是一個用於存取某種數據倉庫中的對象的標準化API。JDO提供了透明的對象存儲),JPA(Java Persistence API.JPA通過JDK 5.0註解或XML描述對象-關係表的映射關係,並將運行期的實體對象持久化到數據庫中)中。ORM Cache的使用方法有個原則——不要把沒有Commit的修改數據放入到緩存中。這是爲了防止Read Dirty。數據庫事務分爲兩種,一種是讀事務,不修改數據,一種是寫事務,修改數據。 

4)ORM Cache一般分爲兩種。一種是ID Cache(ORM文檔中稱爲二級Cache),用來存放Entity ID對應的Entity對象;一種是Query Cache,用來存放一條查詢語句對應的查詢結果集.Query Cache的性能需要考慮幾個方面。比如,Query Key。Query Key一般由2個部分組成:Query String部分,SQL, HQL, EQL, or OQL;參數部分。尋找Query Key的對應數據的時候,Query Key的比較有兩個步驟,先hash,然後equals 

原文地址:http://blog.csdn.net/smaychun/article/details/8569152

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