Spring Boot整合EhCache的步驟詳解
本文講解Spring Boot與EhCache的整合。
1 EhCache簡(jiǎn)介
EhCache 是一個(gè)純Java的進(jìn)程內(nèi)緩存框架,具有快速、精干等特點(diǎn),是Hibernate中默認(rèn)CacheProvider。Ehcache是一種廣泛使用的開源Java分布式緩存。主要面向通用緩存,Java EE和輕量級(jí)容器。它具有內(nèi)存和磁盤存儲(chǔ),緩存加載器,緩存擴(kuò)展,緩存異常處理程序,一個(gè)gzip緩存servlet過(guò)濾器,支持REST和SOAP api等特點(diǎn)。
2 Spring Boot整合EhCache步驟 2.1 創(chuàng)建項(xiàng)目,導(dǎo)入依賴
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.yiidian</groupId> <artifactId>ch03_10_springboot_ehcache</artifactId> <version>1.0-SNAPSHOT</version> <!-- 導(dǎo)入springboot父工程. 注意:任何的SpringBoot工程都必須有的?。。?--> <!-- 父工程的作用:鎖定起步的依賴的版本號(hào),并沒(méi)有真正到依賴 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.11.RELEASE</version> </parent> <dependencies> <!--web起步依賴--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--springboot 集成 junit 起步依賴--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <version>2.1.6.RELEASE</version> <scope>test</scope> </dependency> <!-- 緩存坐標(biāo) --> <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-cache --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> <version>2.1.11.RELEASE</version> </dependency> <!-- Ehcache支持 --> <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId> <version>2.10.6</version> </dependency> </dependencies> </project>
2.2 配置ehcache.xml
在resources目錄下建立ehcache.xml,內(nèi)容如下:
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../config/ehcache.xsd"> <diskStore path="java.io.tmpdir"/> <!-- defaultCache: 默認(rèn)配置 --> <defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" maxElementsOnDisk="10000000" diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU"> <persistence strategy="localTempSwap"/> </defaultCache> <!-- 緩存名稱為customer的配置 --> <cache name="customer" maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" maxElementsOnDisk="10000000" diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU"> <persistence strategy="localTempSwap"/> </cache> </ehcache>
參數(shù)說(shuō)明
- name 緩存名稱
- maxElementsInMemory 緩存最大個(gè)數(shù)
- eternal 對(duì)象是否永久有效,一但設(shè)置了,timeout將不起作用
- timeToIdleSeconds 設(shè)置對(duì)象在失效前的允許閑置時(shí)間(單位:秒)。僅當(dāng)eternal=false對(duì)象不是永久有效時(shí)使用,可選屬性,默認(rèn)值是0,也就是可閑置時(shí)間無(wú)窮大
- timeToLiveSeconds 設(shè)置對(duì)象在失效前允許存活時(shí)間(單位:秒)。最大時(shí)間介于創(chuàng)建時(shí)間和失效時(shí)間之間。僅當(dāng)eternal=false對(duì)象不是永久有效時(shí)使用,默認(rèn)是0.,也就是對(duì)象存活時(shí)間無(wú)窮大
- overflowToDisk 當(dāng)內(nèi)存中對(duì)象數(shù)量達(dá)到maxElementsInMemory時(shí),Ehcache將會(huì)對(duì)象寫到磁盤中
- diskSpoolBufferSizeMB 這個(gè)參數(shù)設(shè)置DiskStore(磁盤緩存)的緩存區(qū)大小。默認(rèn)是30MB。每個(gè)Cache都應(yīng)該有自己的一個(gè)緩沖區(qū)
- maxElementsOnDisk 硬盤最大緩存?zhèn)€數(shù)
- diskPersistent 是否緩存虛擬機(jī)重啟期數(shù)據(jù)
- diskExpiryThreadIntervalSeconds 磁盤失效線程運(yùn)行時(shí)間間隔,默認(rèn)是120秒。
- memoryStoreEvictionPolicy 當(dāng)達(dá)到maxElementsInMemory限制時(shí),Ehcache將會(huì)根據(jù)指定的策略去清理內(nèi)存。默認(rèn)策略是LRU(最近最少使用)。你可以設(shè)置為FIFO(先進(jìn)先出)或是LFU(較少使用)
- clearOnFlush 內(nèi)存數(shù)量最大時(shí)是否清除
2.3 編寫application.yml
#配置EhCache的配置 spring: cache: ehcache: config: ehcache.xml # 讀取ehcache.xml配置
2.4 編寫引導(dǎo)類
package com.yiidian;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
/**
* Spring Boot引導(dǎo)類
* 一點(diǎn)教程網(wǎng) - www.yiidian.com
*/
@SpringBootApplication
@EnableCaching // 開啟緩存
public class MyBootApplication {
public static void main(String[] args) {
SpringApplication.run(MyBootApplication.class,args);
}
}
引導(dǎo)類中需要添加@EnableCaching注解,開啟緩存功能
2.5 編寫Service類
package com.yiidian.service;
import com.yiidian.domain.Customer;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
/**
* 業(yè)務(wù)層
*一點(diǎn)教程網(wǎng) - www.yiidian.com
*/
@Service
public class CustomerService {
@Cacheable(value = "customer",key = "#id")
public Customer findById(Integer id){
System.out.println("執(zhí)行了UserService獲取User");
Customer customer = new Customer();
customer.setId(1);
customer.setName("小明");
customer.setGender("男");
customer.setTelephone("13244445555");
return customer;
}
}
@Cacheable的屬性:
- value:對(duì)應(yīng)ehcache.xml的緩存配置名稱(name屬性值)
- key:給緩存值起個(gè)key,便于Spring內(nèi)部檢索不同的緩存數(shù)據(jù)。#id這個(gè)語(yǔ)法代表把方法形參作為key。
2.6 編寫測(cè)試類
package com.yiidian.test;
import com.yiidian.MyBootApplication;
import com.yiidian.service.CustomerService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* SpringBoot整合EhCache
* 一點(diǎn)教程網(wǎng) - www.yiidian.com
*/
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = MyBootApplication.class)
public class EhCacheDemo {
@Autowired
private CustomerService customerService;
@Test
public void test1(){
//查詢第一次
System.out.println(customerService.findById(1));
//查詢第二次
System.out.println(customerService.findById(1));
}
}
2.7 運(yùn)行測(cè)試

從結(jié)果可以看出,第一次調(diào)用Service的時(shí)候,到Service內(nèi)部獲取數(shù)據(jù)。但是第二次調(diào)用Service時(shí)已經(jīng)不需要從Service獲取數(shù)據(jù),證明第一次查詢的時(shí)候已經(jīng)把Customer對(duì)象緩存到EhCache中。
3 EhCache常用注解 @Cacheable: 主要針對(duì)方法配置,能夠根據(jù)方法的請(qǐng)求參數(shù)對(duì)其進(jìn)行緩存 @CacheConfig: 統(tǒng)一配置本類的緩存注解的屬性 @CachePut:保證方法被調(diào)用,又希望結(jié)果被緩存。與@Cacheable區(qū)別在于是否每次都調(diào)用方法,常用于更新 @CacheEvict :清空緩存 @Cacheable/@CachePut/@CacheEvict 主要的參數(shù): value:緩存的名稱,在 spring 配置文件中定義,必須指定至少一個(gè)
例如:
@Cacheable(value=”mycache”) 或者
@Cacheable(value={”cache1”,”cache2”}
key:緩存的 key,可以為空,如果指定要按照 SpEL 表達(dá)式編寫,
如果不指定,則缺省按照方法的所有參數(shù)進(jìn)行組合
例如:
@Cacheable(value=”testcache”,key=”#id”)
condition:緩存的條件,可以為空,使用 SpEL 編寫,返回 true 或者 false,
只有為 true 才進(jìn)行緩存/清除緩存
例如:@Cacheable(value=”testcache”,condition=”#userName.length()>2”)
unless 否定緩存。當(dāng)條件結(jié)果為TRUE時(shí),就不會(huì)緩存。
@Cacheable(value=”testcache”,unless=”#userName.length()>2”)
allEntries
(@CacheEvict ): 是否清空所有緩存內(nèi)容,缺省為 false,如果指定為 true,
則方法調(diào)用后將立即清空所有緩存
例如:
@CachEvict(value=”testcache”,allEntries=true)
beforeInvocation
(@CacheEvict): 是否在方法執(zhí)行前就清空,缺省為 false,如果指定為 true,
則在方法還沒(méi)有執(zhí)行的時(shí)候就清空緩存,缺省情況下,如果方法
執(zhí)行拋出異常,則不會(huì)清空緩存
例如:
@CachEvict(value=”testcache”,beforeInvocation=true)
3.1 @Cacheable
@Cacheable注解會(huì)先查詢是否已經(jīng)有緩存,有會(huì)使用緩存,沒(méi)有則會(huì)執(zhí)行方法并緩存。
@Cacheable(value = "customer" ,key = "targetClass + methodName +#p0")
public List<Customer> queryAll(Customer cust) {
return customerDao.findAllByUid(cust);
}
3.2 @CacheConfig
當(dāng)我們需要緩存的地方越來(lái)越多,你可以使用@CacheConfig(cacheNames = {"myCache"})注解來(lái)統(tǒng)一指定value的值,這時(shí)可省略value,如果你在你的方法依舊寫上了value,那么依然以方法的value值為準(zhǔn)。
使用方法如下:
@CacheConfig(cacheNames = {"myCache"})
public class UserServiceImpl implements UserService {
@Override
@Cacheable(key = "targetClass + methodName +#p0")//此處沒(méi)寫value
public List<BotRelation> findUsers(int num) {
return userDao.findUsers(num);
}
.....
}
3.3 @CachePut
@CachePut注解的作用 主要針對(duì)方法配置,能夠根據(jù)方法的請(qǐng)求參數(shù)對(duì)其結(jié)果進(jìn)行緩存,和 @Cacheable 不同的是,它每次都會(huì)觸發(fā)真實(shí)方法的調(diào)用 。簡(jiǎn)單來(lái)說(shuō)就是用戶更新緩存數(shù)據(jù)。但需要注意的是該注解的value 和 key 必須與要更新的緩存相同,也就是與@Cacheable 相同。示例:
@CachePut(value = "customer", key = "targetClass + #p0")
public Customer updata(Customer cust) {
Customer customer = customerDao.findAllById(cust.getId());
customer.updata(cust);
return customer ;
}
@Cacheable(value = "customer", key = "targetClass +#p0")//清空緩存
public Customer save(Customer cust) {
customerDao.save(cust);
return cust;
}
3.4 @CacheEvict
@CachEvict 的作用 主要針對(duì)方法配置,能夠根據(jù)一定的條件對(duì)緩存進(jìn)行清空 。
@Cacheable(value = "customer",key = "#p0.id")
public Customer save(Customer cust) {
customerDao.save(cust);
return job;
}
//清除一條緩存,key為要清空的數(shù)據(jù)
@CacheEvict(value="customer",key="#id")
public void delect(int id) {
customerDao.deleteAllById(id);
}
//方法調(diào)用后清空所有緩存
@CacheEvict(value="customerCache",allEntries=true)
public void delectAll() {
customerDao.deleteAll();
}
//方法調(diào)用前清空所有緩存
@CacheEvict(value="customerCache",beforeInvocation=true)
public void delectAll() {
customerDao.deleteAll();
}
總結(jié)
以上所述是小編給大家介紹的Spring Boot整合EhCache的步驟詳解,希望對(duì)大家有所幫助!
相關(guān)文章
java刪除文件時(shí)總是返回false,刪不掉的解決方案
這篇文章主要介紹了java刪除文件時(shí)總是返回false,刪不掉的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
Spring MVC全局異常處理和單元測(cè)試_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
本篇文章主要介紹了Spring MVC全局異常處理和單元測(cè)試,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08
IDEA無(wú)法識(shí)別SpringBoot項(xiàng)目的簡(jiǎn)單解決辦法
今天使用idea的時(shí)候,遇到idea無(wú)法啟動(dòng)springboot,所以這篇文章主要給大家介紹了關(guān)于IDEA無(wú)法識(shí)別SpringBoot項(xiàng)目的簡(jiǎn)單解決辦法,需要的朋友可以參考下2023-08-08
Maven項(xiàng)目外部jar包導(dǎo)入的實(shí)現(xiàn)示例
在Maven項(xiàng)目里,我們經(jīng)常需要導(dǎo)入jar包依賴,本文主要介紹了Maven項(xiàng)目外部jar包導(dǎo)入的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下2024-08-08
MybatisPlus使用@TableLogic實(shí)現(xiàn)邏輯刪除過(guò)程
這篇文章主要介紹了MybatisPlus使用@TableLogic實(shí)現(xiàn)邏輯刪除過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-05-05
詳解如何讓Spring MVC顯示自定義的404 Not Found頁(yè)面
這篇文章主要介紹了詳解如何讓Spring MVC顯示自定義的404 Not Found頁(yè)面,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-10-10

