背景介绍:
基于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方法便可.