背景介紹: 基於shiro新開發的許可權認證系統,在授權部分採用ehcache作為緩存。系統採用分散式集群部署,因此需要配置ehcache支持集群間緩存的同步 1、配置兩台tomcat,ip一致為本機IP 2、採用rmi方式實現緩存同步。修改ehcache配置文件,一般為ehcache.xml。在其中 ...
背景介紹: 基於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方法即可.