ehcache的基本用法(和Spring集成)

        Ehcache是一个纯Java的进程缓存框架,读写快速,但是也因此会在java程序关闭的时候缓存也会从内存中清除,看百科中有说可以设置缓存在java进程关闭时缓冲到磁盘,在下次重启的时候将缓存写入jvm内存,但是我目前还没有使用到这个策略。

        相较于Redis的好处可能就是不需要单独安装,简单配置即可使用,而且省去通信开销,缺点也显而易见,过分依赖于程序的java进程。

        去年的一个项目中的一个场景是用户会输入一些筛选条件查询制程生产的数据,之后可能会使用导出功能将查询的数据导出Excel。由于数据查询本身不快,从上亿数据中关联几张表查询几十上百万的数据,如果查询和导出都需要去数据库查询的话用户体验会很差,因此引入了ehcache缓存,在一次查询之后以搜索条件拼接成字符串作为key将结果保存到缓存,导出的时候大概率可以命中缓存而不用查询数据库。

·Spring集成ehcache

1. pom添加依赖

2. 编写ehcache配置文件ehcache.xml;

3. spring主配置文件配置ehcache;

需要注意的:

· Ehcache用的标准spring aop动态代理实现方法拦截,所以Ehcache注解只能加在Spring托管的bean方法上;

· 因为ehcache是通过代理实现的,因此同一个类内部调用注解的方法上并不会生效;

4. 开启日志打印,编辑log4j配置文件;

INFO级别即可,DEBUG会打印很多ehcache初始化等详细步骤信息;

·使用

ehcache提供以下两种常用的注解:

1. @Cacheable:写入缓存

@Override  
@Cacheable(value = "myCache", key = "#key")  
public short getActiveTime(String key) {  
    String value = redisDriver.get(key);  
    try {  
        return Short.valueOf(value);  
    } catch (Exception e) {  
        return -1;  
    }  
}  

以上是最常用的一种组合,value是在ehcache.xml里面配置的缓存name,key即缓存的唯一标识,除此之外还有:

unless:当方法返回值满足条件时不保存缓存,方法执行后判断,eg: unless = "#result<0"

condition: 适用于不保存所有的缓存结果,在方法执行之前就进行判断,如:

 @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;
   }

2. @CacheEvict:删除缓存

// 2018.8.14,因为wip数据是根据实验的Glass ID查询的,因此每次修改实验之后都需要删除对应的缓存。
	@CacheEvict(value="expWip", key="#pmExperiment.id", beforeInvocation=true)
	@Transactional
	@Override
	public void updateSelective(PmExperiment pmExperiment) {
	   // 数据库操作	
    }

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

除此之外还有:

allEntries:默认为false,当设置为true时将删除缓存中的所有元素,即不指定key的时候。

附上一篇解读ehcache源码的好文:Ehcache注解核心逻辑源码学习

猜你喜欢

转载自blog.csdn.net/lvdou1120101985/article/details/81665947