1.创建子模块
这里我们创建一个子模块
1 2
| group = 'com.ray.study' artifact ='spring-boot-07-cache-ehcache'
|
2.引入依赖
2.1 继承父工程依赖
在父工程spring-boot-seeds
的 settings.gradle
加入子工程
1 2 3 4 5 6 7 8 9 10 11 12
| rootProject.name = 'spring-boot-seeds' include 'spring-boot-01-helloworld' include 'spring-boot-02-restful-test' include 'spring-boot-03-thymeleaf' include 'spring-boot-04-swagger2' include 'spring-boot-05-jpa' include 'spring-boot-05-mybatis' include 'spring-boot-05-tk-mybatis' include 'spring-boot-06-nosql-redis' include 'spring-boot-06-nosql-mongodb' include 'spring-boot-07-cache-concurrentmap' include 'spring-boot-07-cache-ehcache'
|
这样,子工程spring-boot-07-cache-ehcache
就会自动继承父工程中subprojects
`函数里声明的依赖,主要包含如下依赖:
1 2 3 4 5
| implementation 'org.springframework.boot:spring-boot-starter-web' testImplementation 'org.springframework.boot:spring-boot-starter-test'
compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok'
|
2.2 引入ehcache
`依赖
将子模块spring-boot-07-cache-ehcache
的build.gradle
修改为如下内容:
1 2 3 4 5 6 7 8 9 10
| dependencies { implementation 'org.springframework.boot:spring-boot-starter-cache' implementation 'net.sf.ehcache:ehcache'
implementation 'mysql:mysql-connector-java' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' }
|
3.数据库准备
4.修改配置
4.1 修改application.yml
4.2 CacheConfiguration
开启缓存支持
4.3 配置ehcache.xml
(1)默认自动加载resources目录下的ehcache.xml文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| <?xml version="1.0" encoding="UTF-8"?> <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd">
<diskStore path="java.io.tmpdir" /> <defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" maxElementsOnDisk="10000000" diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU">
<persistence strategy="localTempSwap" /> </defaultCache>
<cache name="user" eternal="false" timeToIdleSeconds="2400" timeToLiveSeconds="2400" maxEntriesLocalHeap="10000" maxEntriesLocalDisk="10000000" diskExpiryThreadIntervalSeconds="120" overflowToDisk="false" memoryStoreEvictionPolicy="LRU"> </cache> </ehcache>
|
这里配置了一个 cacheName为 user 的cache,实际使用时指定的缓存名称必须是在此配置文件中存在的,否则会抛找不到cache的异常
1 2 3 4 5 6
| @CachePut(value = "user", key = "#user.name") public User save(User user) { User u = userRepository.save(user); log.info("新增:缓存用户,用户id为:{}", u.getId()); return u; }
|
(2)对于EhCache的配置文件也可以通过application.yml
文件中使用spring.cache.ehcache.config
属性来指定,比如:
1 2 3 4
| spring: cache: ehcache: config: classpath:ehcache.xml
|
(3)ehcache.xml配置文件详解
diskStore
:为缓存路径,ehcache分为内存和磁盘两级,此属性定义磁盘的缓存位置。
defaultCache
:默认缓存策略,当ehcache找不到定义的缓存时,则使用这个缓存策略。只能定义一个。
name
:缓存名称。
maxElementsInMemory
:缓存最大数目
maxElementsOnDisk
:硬盘最大缓存个数。
eternal
:对象是否永久有效,一但设置了,timeout将不起作用。
overflowToDisk
:是否保存到磁盘,当系统宕机时
timeToIdleSeconds
:设置对象在失效前的允许闲置时间(单位:秒)。仅当eternal=false对象不是永久有效时使用,可选属性,默认值是0,也就是可闲置时间无穷大。
timeToLiveSeconds
:设置对象在失效前允许存活时间(单位:秒)。最大时间介于创建时间和失效时间之间。仅当eternal=false对象不是永久有效时使用,默认是0.,也就是对象存活时间无穷大。
diskPersistent
:是否缓存虚拟机重启期数据 Whether the disk store persists between restarts of the Virtual Machine. The default value is false.
diskSpoolBufferSizeMB
:这个参数设置DiskStore(磁盘缓存)的缓存区大小。默认是30MB。每个Cache都应该有自己的一个缓冲区。
diskExpiryThreadIntervalSeconds
:磁盘失效线程运行时间间隔,默认是120秒。
memoryStoreEvictionPolicy
:当达到maxElementsInMemory限制时,Ehcache将会根据指定的策略去清理内存。默认策略是LRU(最近最少使用)。你可以设置为FIFO(先进先出)或是LFU(较少使用)。
clearOnFlush
:内存数量最大时是否清除。