分布式EHCACHE系统,如何实现缓存数据同步?
方式1: RMI组播方式
这也是最常用的方式,配置简单,关键一点,各EHCACHE的节点配置都是一样的
例子:
spring 配置中调用的ehcache文件
id="cacheManager"
class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
name="configLocation">
classpath:ehcache_mc.xml
class="org.springframework.cache.ehcache.EhCacheFactoryBean">
name="cacheManager">
name="cacheName">
userCache
ehcache_mc.xml:
maxElementsInMemory="10000"
maxElementsOnDisk="0"
eternal="true"
overflowToDisk="true"
diskSpoolBufferSizeMB="20"
memoryStoreEvictionPolicy="LFU"
transactionalMode="off">
class="net.sf.ehcache.distribution.RMICacheReplicatorFactory" properties="replicateAsynchronously=true, replicatePuts=true,
replicateUpdates=true,replicateUpdatesViaCopy= true,
replicateRemovals= true "
/>
class="cn.com.gary.test.ehcache.EventFactory" />
class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
properties="peerDiscovery=automatic,
multicastGroupAddress=230.0.0.1,
multicastGroupPort=4446,timeToLive=255"/>
class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"/>
原理:
这样当缓存改变时,ehcache会向230.0.0.1端口4446发RMI UDP组播包
这种组播方式的缺陷:
EHCACHE的组播做得比较初级,功能只是基本实现(比如简单的一个HUB,接两台单网卡的服务器,互相之间组播同步就没问题),对一些复杂的环境(比如多台服务器,每台服务器上多地址,尤其是集群,存在一个集群地址带多个物理机,每台物理机又带多个虚拟站的子地址),就容易出现问题.
究其原因, 组播/广播转发是一个很复杂的过程. 简单的说,
一个组播缺省只能在一个网段内传输,不能跨网段.
举