缓存--ehcache2结合spring使用

经过spring大佬的集成,ehcache2使用起来非常简单。

 

配置文件元素解释

一、以下属性是必须的:
  1、name: Cache的名称,必须是唯一的(ehcache会把这个cache放到HashMap里)。
  2、maxElementsInMemory:在内存中缓存的element的最大数目。
  3、maxElementsOnDisk:在磁盘上缓存的element的最大数目,默认值为0,表示不限制。
  4、eternal:设定缓存的elements是否永远不过期。如果为true,则缓存的数据始终有效,如果为false那么还要根据timeToIdleSeconds,timeToLiveSeconds判断。
  5、overflowToDisk: 如果内存中数据超过内存限制,是否要缓存到磁盘上。
二、以下属性是可选的:
  1、timeToIdleSeconds: 对象空闲时间,指对象在多长时间没有被访问就会失效。只对eternal为false的有效。默认值0,表示一直可以访问。
  2、timeToLiveSeconds: 对象存活时间,指对象从创建到失效所需要的时间。只对eternal为false的有效。默认值0,表示一直可以访问。
  3、diskPersistent: 是否在磁盘上持久化。指重启jvm后,数据是否有效。默认为false。
  4、diskExpiryThreadIntervalSeconds: 对象检测线程运行时间间隔。标识对象状态的线程多长时间运行一次。
  5、diskSpoolBufferSizeMB: DiskStore使用的磁盘大小,默认值30MB。每个cache使用各自的DiskStore。
  6、memoryStoreEvictionPolicy: 如果内存中数据超过内存限制,向磁盘缓存时的策略。默认值LRU,可选FIFO、LFU。
四、缓存的3 种清空策略 :
  1、FIFO ,first in first out (先进先出).
  2、LFU , Less Frequently Used (最少使用).意思是一直以来最少被使用的。缓存的元素有一个hit 属性,hit 值最小的将会被清出缓存。
  3、LRU ,Least Recently Used(最近最少使用). (ehcache 默认值).缓存的元素有一个时间戳,当缓存容量满了,而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存。

 

实际例子Demo

1、ehcache2  xml配置文件

diskPersistent设置为true,即使服务重启,经测试缓存依然保存。

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
    updateCheck="false">

    <diskStore path="D:/testData" />

    <defaultCache 
        maxElementsInMemory="10000"
        maxElementsOnDisk="0" 
        eternal="true" 
        overflowToDisk="true"
        diskPersistent="false" 
        timeToIdleSeconds="0" 
        timeToLiveSeconds="0"
        diskSpoolBufferSizeMB="50" 
        diskExpiryThreadIntervalSeconds="120"
        memoryStoreEvictionPolicy="LFU" />

    <cache name="myCache"         
        maxElementsInMemory="1000"
        maxElementsOnDisk="0" 
        eternal="false" 
        overflowToDisk="false"
        diskPersistent="true" 
        timeToIdleSeconds="300" 
        timeToLiveSeconds="600"
        diskSpoolBufferSizeMB="50" 
        diskExpiryThreadIntervalSeconds="120"
        memoryStoreEvictionPolicy="LFU" />

</ehcache> 

2、spring中引入ehcache 和配置文件

注意头部引入信息需加入:   xmlns:cache="http://www.springframework.org/schema/cache"

    <cache:annotation-driven/>

    <bean id="ehcacheManager"
        class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
        <property name="configLocation" value="classpath:ehcache-config.xml" />
    </bean>

    <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
        <property name="cacheManager" ref="ehcacheManager" />
        <property name="transactionAware" value="true" />
    </bean>

3、通过注解使用缓存

注意,只有被spring管理的Bean,注解才会生效。 spring生成Bean时根据注解生成了代理对象,将缓存代码加入其中。

	//将id 和返回信息以键值对 存入缓存
	@Cacheable(value="myCache",key="#id")
	public String getUser(int id){
		System.out.println("進行計算"+id);
		return id+"用戶";
	}
	
	//移除缓存
	@CacheEvict(value="myCache",key="#id")
	public void deleteUser(int id){
		System.out.println("删除了用户"+id);
	}
	

 

注解的解释

1.@Cacheable
  可以标记在一个方法上,也可以标记在一个类上。当标记在一个方法上时表示该方法是支持缓存的,当标记在一个类上时则表示该类所有的方法都是支持缓存的。对于一个支持缓存的方法,Spring会在其被调用后将其返回值缓存起来,以保证下次利用同样的参数来执行该方法时可以直接从缓存中获取结果,而不需要再次执行该方法。Spring在缓存方法的返回值时是以键值对进行缓存的,值就是方法的返回结果,至于键的话,Spring又支持两种策略,默认策略和自定义策略。
  需要注意的是当一个支持缓存的方法在对象内部被调用时是不会触发缓存功能的。@Cacheable可以指定三个属性,value、key和condition。

2.@CachePut
  在支持Spring Cache的环境下,对于使用@Cacheable标注的方法,Spring在每次执行前都会检查Cache中是否存在相同key的缓存元素,如果存在就不再执行该方法,而是直接从缓存中获取结果进行返回,否则才会执行并将返回结果存入指定的缓存中。而@CachePut也可以声明一个方法支持缓存功能。与@Cacheable不同的是使用@CachePut标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果,而是每次都会执行该方法,并将执行结果以键值对的形式存入指定的缓存中。
  @CachePut也可以标注在类上和方法上。使用@CachePut时我们可以指定的属性跟@Cacheable是一样的。
3.@CacheEvict
  @CacheEvict是用来标注在需要清除缓存元素的方法或类上的。当标记在一个类上时表示其中所有的方法的执行都会触发缓存的清除操作。@CacheEvict可以指定的属性有value、key、condition、allEntries和beforeInvocation。其中value、key和condition的语义与@Cacheable对应的属性类似。即value表示清除操作是发生在哪些Cache上的(对应Cache的名称);key表示需要清除的是哪个key,如未指定则会使用默认策略生成的key;condition表示清除操作发生的条件。
 
属性一 :value

  必须指定的,其表示当前方法的返回值是会被缓存在哪个Cache上的,对应Cache的名称,为ehcache.xml中的<cache name="myCache"/> 。其可以是一个Cache也可以是多个Cache,当需要指定多个Cache时其是一个数组。
属性二 :key

  缓存的Key,当我们没有指定该属性时,Spring将使用默认策略生成key(表示使用方法的参数类型及参数值作为key),key属性是用来指定Spring缓存方法的返回结果时对应的key的。该属性支持SpringEL表达式。我们还可以自定义策略:自定义策略是指我们可以通过Spring的EL表达式来指定我们的key。这里的EL表达式可以使用方法参数及它们对应的属性。使用方法参数时我们可以直接使用“#参数名”或者“#p参数index”
  key的生成策略有两种:一种是默认策略,一种是自定义策略
   ¹默认的key生成策略是通过KeyGenerator生成的,其默认策略如下:
     1.如果方法没有参数,则使用0作为key。
     2.如果只有一个参数的话则使用该参数作为key。
      3.如果参数多余一个的话则使用所有参数的hashCode作为key
   ²自定义策略是指我们可以通过Spring的EL表达式来指定我们的key。这里的EL表达式可以使用方法参数及它们对应的属性。使用方法参数时我们可以直接使用“#参数名”或者“#p参数index
属性三 :condition

  有的时候我们可能并不希望缓存一个方法所有的返回结果。通过condition属性可以实现这一功能。
condition属性默认为空,表示将缓存所有的调用情形。其值是通过SpringEL表达式来指定的,当为true时表示进行缓存处理;当为false时表示不进行缓存处理,即每次调用该方法时该方法都会执行一次。如下示例表示只有当user的id为偶数时才会进行缓存
    @Cacheable(value={"users"}, key="#user.id", condition="#user.id%2==0")
     public User find(User user) {
     System.out.println("find user by user " + user);
     return user;
    }
属性四 :allEntries

  是boolean类型,表示是否需要清除缓存中的所有元素。默认为false,表示不需要。当指定了allEntries为true时,Spring Cache将忽略指定的key。有的时候我们需要Cache一下清除所有的元素,这比一个一个清除元素更有效率。
   @CacheEvict(value="users", allEntries=true)
   public void delete(Integer id) {
   System.out.println("delete user by id: " + id);
   }
属性五 :beforeInvocation

  清除操作默认是在对应方法成功执行之后触发的,即方法如果因为抛出异常而未能成功返回时也不会触发清除操作。使用beforeInvocation可以改变触发清除操作的时间,当我们指定该属性值为true时,Spring会在调用该方法之前清除缓存中的指定元素。
  @CacheEvict(value="users", beforeInvocation=true)
  public void delete(Integer id) {
   System.out.println("delete user by id: " + id);
  }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值