ehcache应用场景及集群同步(RMI)

背景介绍:
      基于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方法即可.
posted @ 2016-06-05 19:12  熊仔下去遛弯了  阅读(2158)  评论(5编辑  收藏  举报