Spring整合Mybaits实现ehcache 注解查询缓存

前言:EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点。

ehcache官网:http://www.ehcache.org/ 可以下载文档看看,里面写的很清楚。

主要的特性有:

  1. 快速
  2. 简单
  3. 多种缓存策略
  4. 缓存数据有两级:内存和磁盘,因此无需担心容量问题
  5. 缓存数据会在虚拟机重启的过程中写入磁盘
  6. 可以通过RMI、可插入API等方式进行分布式缓存
  7. 具有缓存和缓存管理器的侦听接口
  8. 支持多缓存管理器实例,以及一个实例的多个缓存区域
  9. 提供Hibernate的缓存实现

Spring Cache是作用在方法上的,其核心思想是这样的:当我们在调用一个缓存方法时会把该方法参数和返回结果作为一个键值对存放在缓存中,等到下次利用同样的参数来调用该方法时将不再执行该方法,而是直接从缓存中获取结果进行返回。所以在使用Spring Cache的时候我们要保证我们缓存的方法对于相同的方法参数要有相同的返回结果。使用Spring Cache需要我们做两方面的事:1.声明某些方法使用缓存 2.配置Spring对Cache的支持

1、准备工作

需要用到的jar包

这里写图片描述

由于现在基本都是maven项目,这里给出pom依赖配置

这里写图片描述

2、基本配置

这里写图片描述

我们看到配置中的

<cache:annotation-driven />
 
 
  • 1

这个配置如果是想开启缓存注解,是必须加上的,否则注解不会生效。

我们想必在上述配置也看到了,还需引入一个ehcache.xml文件,现也给出,如下

<?xml version="1.0" encoding="UTF-8"?>

<!-- 启动不检查更新 -->
<ehcache updateCheck="false">

    <!-- 全局默认cache配置 -->
    <defaultCache overflowToDisk="true" eternal="false"
        maxElementsInMemory="1000" timeToIdleSeconds="120" timeToLiveSeconds="120" />

    <!--必须属性:
    name:设置缓存的名称,用于标志缓存,惟一
    maxElementsInMemory:在内存中最大的对象数量
    maxElementsOnDisk:在DiskStore中的最大对象数量,如为0,则没有限制
    eternal:设置元素是否永久的,如果为永久,则timeout忽略
    overflowToDisk:是否当memory中的数量达到限制后,保存到Disk

    可选的属性:
    timeToIdleSeconds:用于设置对象在cache中的最大闲置时间,就是 在一直不访问这个对象的前提下,这个对象可以在cache中的存活时间
    timeToLiveSeconds:用于设置对象在cache中的最大存活时间,就是 无论对象访问或是不访问(闲置),这个对象在cache中的存活时间
    diskPersistent:是否disk store在虚拟机启动时持久化。默认为false
    diskExpiryThreadIntervalSeconds:运行disk终结线程的时间,默认为120秒
    memoryStoreEvictionPolicy:策略关于Eviction  -->

    <!-- 样例信息缓存
    <cache name="cache.smart.sample"
      maxEntriesLocalHeap="10000"
      eternal="false"
      timeToIdleSeconds="3600"
      overflowToDisk="false"
      memoryStoreEvictionPolicy="LRU">
    </cache>
    -->

    <!-- IP白名单-->
    <cache name="cache.bacs.meraccount"
      maxEntriesLocalHeap="10000"
      eternal="false"
      timeToIdleSeconds="3600"
      timeToLiveSeconds="1200"
      overflowToDisk="false"
      memoryStoreEvictionPolicy="LRU">
    </cache>

</ehcache>

3、缓存实现

3.1、缓存实体model

这里写图片描述

注意:要实现缓存的实体必须要序列化

3.2、Mybaits的dao层实现

这里就不给出范例了,会用mybaits的应该都知道

3.3、cache实现

这里写图片描述

一下子看到了三个缓存注解的使用,现在我们来讲讲它们的使用

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

  • @CachePut
    在支持Spring Cache的环境下,对于使用@Cacheable标注的方法,Spring在每次执行前都会检查Cache中是否存在相同key的缓存元素,如果存在就不再执行该方法,而是直接从缓存中获取结果进行返回,否则才会执行并将返回结果存入指定的缓存中。而@CachePut也可以声明一个方法支持缓存功能。与@Cacheable不同的是使用@CachePut标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果,而是每次都会执行该方法,并将执行结果以键值对的形式存入指定的缓存中。
    @CachePut也可以标注在类上和方法上。使用@CachePut时我们可以指定的属性跟@Cacheable是一样的。

  • @CacheEvict
    @CacheEvict是用来标注在需要清除缓存元素的方法或类上的。当标记在一个类上时表示其中所有的方法的执行都会触发缓存的清除操作。@CacheEvict可以指定的属性有valuekeyconditionallEntriesbeforeInvocation。其中valuekeycondition的语义与@Cacheable对应的属性类似。即value表示清除操作是发生在哪些Cache上的(对应Cache的名称);key表示需要清除的是哪个key,如未指定则会使用默认策略生成的keycondition表示清除操作发生的条件。

属性一 :value

必须指定的,其表示当前方法的返回值是会被缓存在哪个Cache上的,对应Cache的名称,为ehcache.xml中的 。其可以是一个Cache也可以是多个Cache,当需要指定多个Cache时其是一个数组。

属性二 :key

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

1.1. 如果方法没有参数,则使用0作为key
1.2. 如果只有一个参数的话则使用该参数作为key
1.3. 如果参数多余一个的话则使用所有参数的hashCode作为key

2.自定义策略是指我们可以通过Spring EL表达式来指定我们的key。这里的EL表达式可以使用方法参数及它们对应的属性。使用方法参数时我们可以直接使用“#参数名”或者“#p参数index

属性三 :condition

有的时候我们可能并不希望缓存一个方法所有的返回结果。通过condition属性可以实现这一功能。
condition属性默认为空,表示将缓存所有的调用情形。其值是通过SpringEL表达式来指定的,当为true时表示进行缓存处理;当为false时表示不进行缓存处理,即每次调用该方法时该方法都会执行一次。如下示例表示只有当userid为偶数时才会进行缓存

属性四 :allEntries

boolean类型,表示是否需要清除缓存中的所有元素。默认为false,表示不需要。当指定了allEntriestrue时,Spring Cache将忽略指定的key。有的时候我们需要Cache一下清除所有的元素,这比一个一个清除元素更有效率。

属性五 :beforeInvocation

清除操作默认是在对应方法成功执行之后触发的,即方法如果因为抛出异常而未能成功返回时也不会触发清除操作。使用beforeInvocation可以改变触发清除操作的时间,当我们指定该属性值为true时,Spring会在调用该方法之前清除缓存中的指定元素。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值