背景介紹:
基於shiro新開發的權限認證系統,在授權部分采用ehcache作為緩存。系統采用分布式集群部署,因此需要配置ehcache支持集群間緩存的同步
1、配置兩台tomcat,ip一致為本機IP
2、采用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。
思考問題:
1、為什么用ehcache及其使用場景
簡單,快捷
支持分布式擴展
支持內存緩存和磁盤緩存
有多種緩存策略
適合最重要
缺點:內存不獨立,多機器同步會出現延遲問題。
使用於更新少,單進程的應用場景。如果分布式部署建議還是用redis:
redis是鍵值對緩存服務器,可設置儲存到硬盤中.
也就可以當數據庫用.其訪問效率較高.java中可使用jedit框架來操作redis.
雖然jedis提供了很多方法,如果只是使用緩存的話可不必關心太多,直接使用set/get方法即可.
