1. 程式人生 > >EhCache 分散式快取物件的同步

EhCache 分散式快取物件的同步

為了提升目前開發產品的效能,專案組內考慮將一些常用的資料放入快取,並且今後要將系統分散式部署,以達到負載均衡的目的,因此快取同步問題就不得不需要考慮,該專案中主要用EhCache產品,EhCache的優勢和劣勢這裡就不做介紹,網上可以搜尋,單從這次專案出發,說說他在專案中的應用,HibernateSpring都集成了EhCache,如果您的專案中用到這兩個框架,那將會大大降低開發複雜度,如果沒有使用此類框架,Ehcache還提供在專案中獨立使用。

先大概瞭解一下EhCache的原理吧,見下圖:

主要為三層,最上層的是CacheManager,它是操作Ehcache的入口。我們可以通過CacheManager.getInstance()

(還有別的方法,可檢視API)獲得一個單例的CacheManger;每個CacheManager都管理著多個Cache;而每個Cache都以Hash的方式,關聯著多個 ElementElement則是我們用於存放要快取物件的地方。

先從EhCache在專案中獨立使用的Demo說起:

開發環境:Eclipse4.0(不受限制)、JDK1.5

引用Jar包:ehcache-core-2.5.2.jar

                   junit-3.8.1.jar

                  slf4j-api-1.6.1.jar

                  slf4j-jdk14-1.6.1.jar

新建一個Java Project,引入以上jar包,建立一個測試類TestPutElement,程式碼如下:

package ehcache;

import java.net.URL;
import test.User;

import junit.framework.TestCase;
import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;

public class TestPutElement extends TestCase {
	
	public void testPut() throws Exception {
		
		URL url = TestPutCache.class.getClassLoader().getResource(
				"conf/ehcache.xml");
		CacheManager manager = new CacheManager(url);
		
		Cache cache = manager.getCache("metaCache");

		User user = new User();
		user.setName("張三");
		Element element = new Element("key",user);
		cache.put(element);

		manager.shutdown();
		System.out.println("已放入快取!");
	}
}

建立一個POJO物件User,一定要經過序列化,並保證序列化UID的存在:

import java.io.Serializable;

public class User implements Serializable {

	private static final long serialVersionUID = -4402392412217726278L;
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}

在ClassPath目錄下加入ehcache.xml檔案,這也可以在Ehcachejar包中找到,有兩個注意事項,不要刪除defaultcache,如果是兩臺不同的電腦,那麼把cacheManagerPeerProviderFactory中的第二個localhost換成另一臺機器IP即可,埠號是可以自定義的,不過要注意不要和系統使用的埠衝突,不然會報錯;

<?xml version="1.0" encoding="UTF-8"?>

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="ehcache.xsd"
         updateCheck="true" monitoring="autodetect"
         dynamicConfig="true">

 	<diskStore path="java.io.tmpdir" />

	<!-- 指定除自身之外的網路群體中其他提供同步的主機列表,用“|”分開不同的主機 -->
	<cacheManagerPeerProviderFactory
		class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
		properties="peerDiscovery=manual,rmiUrls=//localhost:40004/metaCache|//localhost:60000/metaCache" />

	<!-- 配宿主主機配置監聽程式,來發現其他主機發來的同步請求 -->
	<cacheManagerPeerListenerFactory
		class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"
		properties="port=40004,socketTimeoutMillis=120000" />

	<!-- 預設快取 -->
	<defaultCache maxElementsInMemory="10000" eternal="false"
		timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true"
		diskSpoolBufferSizeMB="30" maxElementsOnDisk="10000000"
		diskPersistent="false" diskExpiryThreadIntervalSeconds="120"
		memoryStoreEvictionPolicy="LRU">
	</defaultCache>

	<!-- 快取 -->
	<cache name="metaCache" 
		maxElementsInMemory="1000" 
		eternal="false"
		timeToIdleSeconds="2000" 
		timeToLiveSeconds="1000" 
		overflowToDisk="false">
		<cacheEventListenerFactory
			class="net.sf.ehcache.distribution.RMICacheReplicatorFactory" />
		<!-- <bootstrapCacheLoaderFactory
			class="net.sf.ehcache.distribution.RMIBootstrapCacheLoaderFactory"
			properties="bootstrapAsynchronously=false" /> -->
	</cache>
</ehcache>

到此為止,放入快取,也就是傳送端配置好了,下面開始建立另個Java Project(),User類不變,必須要注意的是序列化UID和上一個Java Project要一致,否則會報ClassNotFound的錯誤,下面是測試類:

package ehcache;

import java.net.URL;

import test.User;
import junit.framework.TestCase;
import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;

public class TestGetCache extends TestCase {
	
	public void testGet() throws Exception {
		URL url = TestGetCache.class.getClassLoader().getResource(
				"conf/ehcache.xml");
		CacheManager manager = new CacheManager(url);
		
		Cache cache = manager.getCache("metaCache");
		
		while (true) {
			System.out.println("搜尋中...");
			System.out.println("當前資源數:" + cache.getSize());
			Element element = cache.get("key");
			if (element != null) {
				User user = (User)element.getValue();
				System.out.println(user.getName());
				break;
			}
			Thread.sleep(1000);
		}
	}
}
ehcache.xml配置檔案如下:
<?xml version="1.0" encoding="UTF-8"?>

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="ehcache.xsd"
         updateCheck="true" monitoring="autodetect"
         dynamicConfig="true">

 	<diskStore path="java.io.tmpdir" />

	<!-- 指定除自身之外的網路群體中其他提供同步的主機列表,用“|”分開不同的主機 -->
	<cacheManagerPeerProviderFactory
		class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
		properties="peerDiscovery=manual,rmiUrls=//localhost:40004/metaCache|//localhost:60000/metaCache" />

	<!-- 配宿主主機配置監聽程式,來發現其他主機發來的同步請求 -->
	<cacheManagerPeerListenerFactory
		class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"
		properties="port=40004,socketTimeoutMillis=120000" />

	<!-- 預設快取 -->
	<defaultCache maxElementsInMemory="10000" eternal="false"
		timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="true"
		diskSpoolBufferSizeMB="30" maxElementsOnDisk="10000000"
		diskPersistent="false" diskExpiryThreadIntervalSeconds="120"
		memoryStoreEvictionPolicy="LRU">
	</defaultCache>

	<!-- 快取 -->
	<cache name="metaCache" 
		maxElementsInMemory="1000" 
		eternal="false"
		timeToIdleSeconds="2000" 
		timeToLiveSeconds="1000" 
		overflowToDisk="false">
		<cacheEventListenerFactory
			class="net.sf.ehcache.distribution.RMICacheReplicatorFactory" />
<!--  		<bootstrapCacheLoaderFactory
			class="net.sf.ehcache.distribution.RMIBootstrapCacheLoaderFactory"
			properties="bootstrapAsynchronously=true" /> -->
	</cache>
</ehcache>
下面就可以測試了,首先執行後一個java Project專案,然後執行前一個java Project,執行結果為:1,張三。

相關推薦

EhCache 分散式快取物件同步

為了提升目前開發產品的效能,專案組內考慮將一些常用的資料放入快取,並且今後要將系統分散式部署,以達到負載均衡的目的,因此快取同步問題就不得不需要考慮,該專案中主要用EhCache產品,EhCache的優勢和劣勢這裡就不做介紹,網上可以搜尋,單從這次專案出發,說說他在專案中的應用,Hibernate和Spri

Ehcache 分散式快取 -springMVC

開發環境: System:Windows JavaEE Server:tomcat5.0.2.8、tomcat6 JavaSDK: jdk6+ IDE:eclipse、MyEclipse 6.6 開發依賴庫: JDK6、 JavaEE5、ehcache-core

java ehcache 分散式快取配置例項

下面我們動手通過專案來實踐下吧.[RMI方式]; 基本環境:A 分別建立兩個web專案,C1和C2 分別倒入echcache的jar包;                     B 本例使用了兩個tomcat 分別部署C1和C2  專案配置:C1配置       A  e

Ehcache 分散式快取

自從Ehcache 到了1.2+的版本,就支援分散式快取了。我們考慮到Spring + Hibernate的結構 ,ehcache的對這幾個框架的支援較好,就一直採用這個快取方案。 地址:http://ehcache.sourceforge.net/ 先介紹沒有分散式快取需

mybatis整合ehcache分散式快取框架

mybatis提供了一個cache介面,如果要實現自己的快取邏輯,實現cache介面開發即可。 mybatis和ehcache整合,mybatis和ehcache整合包中提供了一個cache介面的實現類。 1.4.3    第一步加入ehcache包   1.4

《深入分散式快取 》第4章Ehcache 與guava cache

一 序    本文屬於《深入分散式快取 》讀書筆記,第一章:快取為王主要介紹快取概念,以及引入快取的背景:提升使用者體驗。還介紹了快取的分類,第二章主要介紹分散式理論。個人覺得第二章可以去掉,畢竟是泛泛的介紹。還是專門去看有主題的書比較好,比如《<從PAXOS

mybatis中二級快取整合ehcache實現分散式快取

    mybatis自帶二級快取,但是這個快取是單伺服器工作,無法實現分散式快取。那麼什麼是分散式快取呢?假設現在有兩個伺服器1和2,使用者訪問的時候訪問了1伺服器,查詢後的快取就會放在1伺服器上,假設現在有個使用者訪問的是2伺服器,那麼他在2伺服器上就無法獲取剛剛那個快取

Memcached 分散式記憶體物件快取系統在Java Web專案收藏欄中的使用

Memcached工具類程式碼 import com.danga.MemCached.MemCachedClient; import com.danga.MemCached.SockIOPool; import java.util.ArrayList; import java.util.List; /

springmvc結合ehcache實現共享物件快取

筆者最近在學習Web效能優化的知識,想用springmvc結合ehcache來實現共享物件快取,可是網上的很多教程講得不是很清楚,加上本人對spring的知識還沒有完全熟悉,所以在實現過程中碰到了各種

memcached分散式快取和hibernate結合-- Hibernate+ehcache二級快取技術

Memcached是由Danga Interactive開發的,高效能的,分散式的記憶體物件快取系統,用於在動態應用中減少資料庫負載,提升訪問速度。Memcached 的快取是一種分散式的,可以讓不同主機上的多個使用者同時訪問, 因此解決了共享記憶體只能單機應用的侷限,更

Hibernate中使用分散式快取ehcache-core-1.3.0

前言 廢話不多說,來這看的,不管你是會ehcache或者從來沒接觸過的,保證看過之後,都能構建一個自己的ehcache專案。因為我在寫這篇部落格的時候,是一邊在配置一邊在記錄過程中遇到的問題,等於是在手把手教學。下面直入正題。 一、下載相關jar包 網上下載ehcache-

ehcache作為分散式快取的研究

ehcache支援兩種拓撲結構,一種是Distributed Caching,另一種是Replicated CachingDistributed Caching這和一般意義上的分散式快取非常類似,這一型別的快取是有client-server之分的,application通過c

【開源專案系列】如何基於 Spring Cache 實現多級快取(同時整合本地快取 Ehcache分散式快取 Redis)

## 一、快取 當系統的併發量上來了,如果我們頻繁地去訪問資料庫,那麼會使資料庫的壓力不斷增大,在高峰時甚至可以出現數據庫崩潰的現象。所以一般我們會使用快取來解決這個資料庫併發訪問問題,使用者訪問進來,會先從快取裡查詢,如果存在則返回,如果不存在再從資料庫裡查詢,最後新增到快取裡,然後返回給使用者,當然了,接

基於zookeeper的分散式佇列之同步佇列

1、同步佇列 同步佇列,顧名思義就是當佇列中的元素滿了的時候去做事情。 例如:一個公司組織旅遊,只有當報名了的員工全部到齊後司機才能出發。 我們把需求拆分開: 1、員工簽到,我們可以用zookeeper的znode節點來模擬,在/queue路徑下建立子節點,簽到一個建立一個znode

redis→分散式快取

簡介  1. redis 是什麼?  REmote DIctionary Server(遠端字典伺服器)  是完全開源免費的,用 C 語言編寫的,遵守 BSD 協議,是一個高效能的 (key/value)分散式記憶體資料庫,基於記憶體執行並支援

大資料(十三):MapJoin(DistributedCache分散式快取)、資料清理例項與計數器應用

一、在map端表合併(DistributedCache分散式快取) 1.適用場景         適合用於關聯表中有小表的情形。         可以將小表分發到所有的

分散式快取架構設計

零、 題記在高併發場景下,需要通過快取來減少資料庫的壓力,使得大量的訪問進來能夠命中快取,只有少量的需要到資料庫層。由於快取基於記憶體,可支援的併發量遠遠大於基於硬碟的資料庫。所以對於高併發設計,快取的設計是必不可少的一環。一、為什麼要使用快取為什麼要使用快取呢?源於人類的一個夢想,就是多快好省的建設社會

分散式快取:Memcached, Redis, MongoDB區別

分散式快取學習之一:Memcached, Redis, MongoDB區別   Redis是一個開源(BSD許可),記憶體儲存的資料結構伺服器,可用作資料庫,快取記憶體和訊息佇列代理。   Memcached是一個自由開源的,高效能,分散式記憶體物件快取系統。   MongoDB是一個基

mybatis整合分散式快取框架

什麼是分散式快取 為了提高系統的併發效能,通常會對系統進行分散式部署(如叢集部署方式) 如上圖,伺服器1上的mybatis的二級快取位於伺服器1上,伺服器2上的mybatis的二級快取位於伺服器2上。 所以如果不使用分散式快取,快取的資料就會在各個伺服器上單獨儲存,因此,需

OpenGL渲染到幀快取物件(FBO)

視窗系統提供的幀快取是唯一可以被圖形伺服器的顯示系統所識別的幀快取。 也就是說,我們要想在螢幕上看到東西,就必須把它畫在這個視窗系統提供的幀快取中。 自己可以建立幀快取,幀快取有多個attachment,對應shader的輸出 例如 layout (location = 0) out v