背景介紹:
基於shiro新開發的權限認證系統,在受權部分採用ehcache做爲緩存。系統採用分佈式集羣部署,所以須要配置ehcache支持集羣間緩存的同步
一、配置兩臺tomcat,ip一致爲本機IP
二、採用rmi方式實現緩存同步。修改ehcache配置文件,通常爲ehcache.xml。在其中添加以下內容:
2.1<cacheManagerPeerProviderFactory
class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
properties="hostName=localhost,
port=40001,
socketTimeoutMillis=2000,
peerDiscovery=manual,
rmiUrls=//192.168.1.109:40002/sys-roleCache"/>
該配置用於發現集羣中的CacheManager夥伴,也就是發現其餘節點。採用peerDiscovery=manual人工配置的方式發現其餘緩存管理器節點。
目前配置的發現節點爲:192.168.1.109,端口爲:40002,須要同步到cache名稱爲:sys-roleCache。
同時指定當前節點的hostName爲localhost,端口爲40001。通知遠程超時時間:socketTimeoutMillis=2000ms
2.2<cacheManagerPeerListenerFactory
class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"
properties="hostName=localhost, port=40001,
socketTimeoutMillis=2000"/>
該配置爲緩存同步消息的監聽器工廠,用於建立緩存管理listener。
有效的屬性是:
hostname (可選) – 運行監聽器的服務器名稱。標明瞭作爲集羣羣組的成員的地址,同時也是你想要控制的從集羣中接收消息的接口。
在CacheManager初始化的時候會檢查hostname是否可用。
若是hostName不可用,CacheManager將拒絕啓動並拋出一個鏈接被拒絕的異常。
若是指定,hostname將使用InetAddress.getLocalHost().getHostAddress()來獲得。
警告:不要將localhost配置爲本地地址127.0.0.1,由於它在網絡中不可見將會致使不能從遠程服務器接收信息從而不能複製。在同一臺機器上有多個CacheManager的時候,你應該只用localhost來配置。
port – 監聽器監聽的端口。
這裏的端口要和PeerProviderFactory中port一致,不然將不會同步。
socketTimeoutMillis (可選) – Socket超時的時間。默認是2000ms。當你socket同步緩存請求地址比較遠,不是本地局域網。你可能須要把這個時間配置大些,否則極可能延時致使同步緩存失敗。
2.3<cache name="sys-roleCache"
maxEntriesLocalHeap="2000"
eternal="false"
timeToIdleSeconds="3600"
timeToLiveSeconds="0"
memoryStoreEvictionPolicy="LFU"
overflowToDisk="false"
statistics="true">
<cacheEventListenerFactory
class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"
properties="replicateAsynchronously=true,
replicatePuts=true,
replicateUpdates=true,
replicateUpdatesViaCopy=false,
replicateRemovals=true"/>
<bootstrapCacheLoaderFactory
class="net.sf.ehcache.distribution.RMIBootstrapCacheLoaderFactory"/>
</cache>
該配置爲緩存事件監聽器,指定建立緩存複製監聽器的工廠爲:RMICacheReplicatorFactory。
同時指定在容器啓動的時候進行緩存同步。
緩存策略爲:LFU,最近最少命中。
properties解釋:
replicatePuts=true | false – 當一個新元素增長到緩存中的時候是否要複製到其餘的peers. 默認是true。
replicateUpdates=true | false – 當一個已經在緩存中存在的元素被覆蓋時是否要進行復制。默認是true。
replicateRemovals= true | false – 當元素移除的時候是否進行復制。默認是true。
replicateAsynchronously=true | false – 複製方式是異步的(指定爲true時)仍是同步的(指定爲false時)。默認是true。
replicatePutsViaCopy=true | false – 當一個新增元素被拷貝到其餘的cache中時是否進行復制指定爲true時爲複製,默認是true。
replicateUpdatesViaCopy=true | false – 當一個元素被拷貝到其餘的cache中時是否進行復制(指定爲true時爲複製),默認是true。
思考問題:
一、爲何用ehcache及其使用場景
簡單,快捷
支持分佈式擴展
支持內存緩存和磁盤緩存
有多種緩存策略
適合最重要
缺點:內存不獨立,多機器同步會出現延遲問題。
使用於更新少,單進程的應用場景。若是分佈式部署建議仍是用redis:
redis是鍵值對緩存服務器,可設置儲存到硬盤中.
也就能夠當數據庫用.其訪問效率較高.java中可以使用jedit框架來操做redis.
雖然jedis提供了不少方法,若是隻是使用緩存的話可沒必要關心太多,直接使用set/get方法便可.