准备:啥也不需要准备,只需要准备一下ehcache.xml文件就可以了。
网上的一些教程,做spring+ehcache的注解缓存需要下载什么spring-annotations.jar
那些都是老掉牙的教程,不符合时代发展,其实spring3.0之后就不需要这玩意了,他自带了!
Ehcache自带了分布式缓存机制,有RMI,JGRUOPS, 貌似还有一种方式,不过,,,我忘了,
我使用的是RMI方式,手动配置
贴上我的ehcache.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance "
xsi:noNamespaceSchemaLocation=" http://ehcache.org/ehcache.xsd ">
<!-- accountservice 缓存配置 -->
<!--EHCache分布式缓存集群环境配置-->
<!--rmi手动配置-->
<!--peer discover 成员发现者,除本服务器其他的服务器-->
<cacheManagerPeerProviderFactory class= "net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
properties="peerDiscovery=manual,rmiUrls=//192.168.0.131:40001/user"/>
<!-- listen监听,监听从成员发现者那里的更新缓存的请求。注意:port可以是任意值,不过需要该端口不可以被占用,不可以和tomcat你修改的端口一样,不然监听起不来的 , 本机的IP -->
<cacheManagerPeerListenerFactory
class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"
properties="hostName=192.168.0.225,port=40003, socketTimeoutMillis=120000"/>
<!--默认缓存配置-->
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
diskSpoolBufferSizeMB="30"
maxElementsOnDisk="10000000"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU">
<cacheEventListenerFactory
class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"/>
</defaultCache>
<!--我们自己定义的缓存,名称为自定义-->
<cache name="user"
maxElementsInMemory="1000"
eternal="false"
timeToIdleSeconds="100000"
timeToLiveSeconds="100000"
overflowToDisk="false">
<cacheEventListenerFactory
class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"/>
</cache>
</ehcache>
以上是一个服务器的配置,每个服务器的配置都不相同,不过走的是一个套路
RMI使用了广播的方式,
按我的理解来说,他的工作方式是,有一个成员发现者,,,
成员发现一个心跳(CUD),就向监听发送信息,监听收到信息,就调用该Cache的监听事件(cacheEventListenerFactory)
进行更新缓存
spring的配置
<cache:annotation-driven cache-manager="cacheManager" />
<!-- ehcache配置-->
<bean id="cacheManagerFactory" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"
p:configLocation="classpath:ehcache.xml"
p:shared="false" />
<!-- 声明cacheManager -->
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager"
p:cacheManager-ref="cacheManagerFactory"/>
应用:
@Cacheable(value="user",key="'user'")
List<Account> getAccountList();
value 的值为ehcache我们定义的缓存名称,key为键,ehcache的缓存是以键值对的方式来进行存储的
key定义字符串的话,注意需要加入单引号
key中可以写contion表达式,一般使用方法的参数,
例:
@Cacheable(value="user",key="#userName")
List<Account> getAccountList(Account account);
使用#号来引出参数的属性
简单应用就是如此,当然,这种分布式缓存达到的效果也是相对的,更高性能的有Redis和memecached,这种缓存服务器,效果会更加理想