Spring Boot---(14)Spring Boot 整合EhCache做缓存

时间:2022-01-23 09:17:09

摘要:本文介绍在SpringBoot项目中,如何使用EhCache做缓存。

EHCache是来自sourceforge(http://ehcache.sourceforge.net/) 的开源项目,也是纯Java实现的简单、快速的Cache组件。EHCache支持内存和磁盘的缓存,支持LRU、LFU和FIFO多种淘汰算法,支持分布式的Cache,可以作为Hibernate的缓存插件。同时它也能提供基于Filter的Cache,该Filter可以缓存响应的内容并采用 Gzip压缩提高响应速度。

1.pom.xml


		<!--缓存-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<!--ehcache-->
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
</dependency>

2.启动类上加上注解:@EnableCaching


加此注解后,会开启SpringBoot对缓存的支持

/**
* the entrance of the application
*/
@EnableAsync
@RestController
@SpringBootApplication
@EnableCaching
//扫描dao
@MapperScan("com.alibaba.dao")
public class TmallApplication {

public static void main(String[] args) {
SpringApplication.run(TmallApplication.class, args);
}

@RequestMapping(value = "hello",method = RequestMethod.GET)
public String getHello(){
return "hello world";
}
}


3.ehcache.xml配置文件


新建ehcache.xml,在resources包下

<?xml version="1.0" encoding="UTF-8"?>
<ehcache>
    <cache name="user"
           maxElementsInMemory="1000"
           eternal="false"
           timeToIdleSeconds="0"
           timeToLiveSeconds="0"
           overflowToDisk="false"
           diskPersistent="false"
           diskSpoolBufferSizeMB="30"
           diskExpiryThreadIntervalSeconds="120"
           memoryStoreEvictionPolicy="LRU"
           clearOnFlush="false"
    />
</ehcache>

参数详解:

         name:缓存名称。
         maxElementsInMemory:缓存最大个数。
         eternal:对象是否永久有效,一但设置了,timeout将不起作用。
         timeToIdleSeconds:设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。
        timeToLiveSeconds:设置对象在失效前允许存活时间(单位:秒)。最大时间介于创建时间和失效时间之间。仅当eternal=false对象不是永久有效时使用,默认是0.,也就是对象存活时间无穷大。
         overflowToDisk:当内存中对象数量达到maxElementsInMemory时,Ehcache将会对象写到磁盘中。
         diskSpoolBufferSizeMB:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。
         maxElementsOnDisk:硬盘最大缓存个数。
        diskPersistent:是否缓存虚拟机重启期数据,默认为false。
         diskExpiryThreadIntervalSeconds:磁盘失效线程运行时间间隔,默认是120秒。
         memoryStoreEvictionPolicy:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用)。
         clearOnFlush:内存数量最大时是否清除。


4.持久层和方法上加上注解


我这里持久层用的jpa,在持久层上加上@CacheConfig(cacheNames = "user")cacheNames 可以自定义,这是缓存的key,哪个方法需要缓存,就在哪个方法上加上@Cacheable注解

package com.alibaba.dao;

import com.alibaba.entity.User;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

/**
* Created by lightClouds917
* Date 2018/2/3
* Description:
*/
@CacheConfig(cacheNames = "user")
public interface UserRepository extends JpaRepository<User,Long> {


User findByName(String name);
@Cacheable
User findById(Integer id);
List<User> findByAddress(String address);
void deleteByName(String name);
}

5.测试


@RequestMapping(value = "test1",method = RequestMethod.GET)
public User test1(Integer id){
User user = userRepository.findById(id);
return user;
}
当第一次调用此接口时,发现有执行sql,第二次调用时,发现不再执行sql了,因为此接口使用此参数获得的结果已经存到缓存中了。当改变参数时,又会继续 查询sql。

jpa开启控制台打印sql;

spring.jpa.show-sql=true


6.Cache注解详解


@CacheConfig:主要用于配置该类中会用到的一些共用的缓存配置。在这里@CacheConfig(cacheNames = "users"):配置了该数据访问对象中返回的内容将存储于名为users的缓存对象中,我们也可以不使用该注解,直接通过@Cacheable自己配置缓存集的名字来定义。


@Cacheable:配置了findByName函数的返回值将被加入缓存。同时在查询时,会先从缓存中获取,若不存在才再发起对数据库的访问。阅读源码,发现该注解主要有下面几个参数:


value、cacheNames:两个等同的参数(cacheNames为Spring 4新增,作为value的别名),用于指定缓存存储的集合名。由于Spring 4中新增了@CacheConfig,因此在Spring 3中原本必须有的value属性,也成为非必需项了
key:缓存对象存储在Map集合中的key值,非必需,缺省按照函数的所有参数组合作为key值,若自己配置需使用SpEL表达式,比如:@Cacheable(key = "#p0"):使用函数第一个参数作为缓存的key值,更多关于SpEL表达式的详细内容可参考官方文档
condition:缓存对象的条件,非必需,也需使用SpEL表达式,只有满足表达式条件的内容才会被缓存,比如:@Cacheable(key = "#p0", condition = "#p0.length() < 3"),表示只有当第一个参数的长度小于3的时候才会被缓存,若做此配置上面的AAA用户就不会被缓存,读者可自行实验尝试。
unless:另外一个缓存条件参数,非必需,需使用SpEL表达式。它不同于condition参数的地方在于它的判断时机,该条件是在函数被调用之后才做判断的,所以它可以通过对result进行判断。
keyGenerator:用于指定key生成器,非必需。若需要指定一个自定义的key生成器,我们需要去实现org.springframework.cache.interceptor.KeyGenerator接口,并使用该参数来指定。需要注意的是:该参数与key是互斥的
cacheManager:用于指定使用哪个缓存管理器,非必需。只有当有多个时才需要使用
cacheResolver:用于指定使用那个缓存解析器,非必需。需通过org.springframework.cache.interceptor.CacheResolver接口来实现自己的缓存解析器,并用该参数指定。


除了这里用到的两个注解之外,还有下面几个核心注解:

@CachePut:配置于函数上,能够根据参数定义条件来进行缓存,它与@Cacheable不同的是,它每次都会真是调用函数,所以主要用于数据新增和修改操作上。它的参数与@Cacheable类似,具体功能可参考上面对@Cacheable参数的解析
@CacheEvict:配置于函数上,通常用在删除方法上,用来从缓存中移除相应数据。除了同@Cacheable一样的参数之外,它还有下面两个参数:
allEntries:非必需,默认为false。当为true时,会移除所有数据
beforeInvocation:非必需,默认为false,会在调用方法之后移除数据。当为true时,会在调用方法之前移除数据。