SpringBoot中使用Ehcache的詳細(xì)教程
EhCache 是一個(gè)純 Java 的進(jìn)程內(nèi)緩存框架,具有快速、精干等特點(diǎn),是 Hibernate 中默認(rèn)的 CacheProvider。用慣了 Redis,很多人可能已經(jīng)忘記了還有 EhCache 這么一個(gè)緩存框架
一、簡(jiǎn)介
EhCache 是一個(gè)純 Java 的進(jìn)程內(nèi)緩存框架,具有快速、精干等特點(diǎn),是 Hibernate 中默認(rèn)CacheProvider。Ehcache 是一種廣泛使用的開(kāi)源 Java 分布式緩存。主要面向通用緩存,Java EE 和輕量級(jí)容器。它具有內(nèi)存和磁盤(pán)存儲(chǔ),緩存加載器,緩存擴(kuò)展,緩存異常處理程序,一個(gè) gzip 緩存 servlet 過(guò)濾器,支持 REST 和 SOAP api 等特點(diǎn)。
特性
- 快速、簡(jiǎn)單
- 多種緩存策略
- 緩存數(shù)據(jù)有兩級(jí):內(nèi)存和磁盤(pán),因此無(wú)需擔(dān)心容量問(wèn)題
- 緩存數(shù)據(jù)會(huì)在虛擬機(jī)重啟的過(guò)程中寫(xiě)入磁盤(pán)
- 可以通過(guò)RMI、可插入API等方式進(jìn)行分布式緩存
- 具有緩存和緩存管理器的偵聽(tīng)接口
- 支持多緩存管理器實(shí)例,以及一個(gè)實(shí)例的多個(gè)緩存區(qū)域
- 提供Hibernate的緩存實(shí)現(xiàn)
與 Redis 相比
- EhCache 直接在jvm虛擬機(jī)中緩存,速度快,效率高;但是緩存共享麻煩,集群分布式應(yīng)用不方便。
- Redis 是通過(guò) Socket 訪問(wèn)到緩存服務(wù),效率比 EhCache 低,比數(shù)據(jù)庫(kù)要快很多,處理集群和分布式緩存方便,有成熟的方案。如果是單個(gè)應(yīng)用或者對(duì)緩存訪問(wèn)要求很高的應(yīng)用,用 EhCache 。如果是大型系統(tǒng),存在緩存共享、分布式部署、緩存內(nèi)容很大的,建議用 Redis。
- EhCache 也有緩存共享方案,不過(guò)是通過(guò) RMI 或者 Jgroup 多播方式進(jìn)行廣播緩存通知更新,緩存共享復(fù)雜,維護(hù)不方便;簡(jiǎn)單的共享可以,但是涉及到緩存恢復(fù),大數(shù)據(jù)緩存,則不合適。
二、引入 EhCache
1、引入依賴
在 pom.xml 文件中,引入 Ehcache 的依賴信息
<!-- ehcache依賴 --> <dependency> <groupId>net.sf.ehcache</groupId> <artifactId>ehcache</artifactId> <version>2.10.6</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency>
2、配置文件
創(chuàng)建 EhCache 的配置文件:ehcache.xml
<?xml version="1.0" encoding="UTF-8"?> <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"> <!-- 磁盤(pán)存儲(chǔ):將緩存中暫時(shí)不使用的對(duì)象,轉(zhuǎn)移到硬盤(pán),類似于Windows系統(tǒng)的虛擬內(nèi)存 path:指定在硬盤(pán)上存儲(chǔ)對(duì)象的路徑 path可以配置的目錄有: user.home(用戶的家目錄) user.dir(用戶當(dāng)前的工作目錄) java.io.tmpdir(默認(rèn)的臨時(shí)目錄) ehcache.disk.store.dir(ehcache的配置目錄) 絕對(duì)路徑(如:d:\\ehcache) 查看路徑方法:String tmpDir = System.getProperty("java.io.tmpdir"); --> <diskStore path="java.io.tmpdir" /> <!-- defaultCache:默認(rèn)的緩存配置信息,如果不加特殊說(shuō)明,則所有對(duì)象按照此配置項(xiàng)處理 maxElementsInMemory:設(shè)置了緩存的上限,最多存儲(chǔ)多少個(gè)記錄對(duì)象 eternal:代表對(duì)象是否永不過(guò)期 (指定true則下面兩項(xiàng)配置需為0無(wú)限期) timeToIdleSeconds:最大的發(fā)呆時(shí)間 /秒 timeToLiveSeconds:最大的存活時(shí)間 /秒 overflowToDisk:是否允許對(duì)象被寫(xiě)入到磁盤(pán) 說(shuō)明:下列配置自緩存建立起600秒(10分鐘)有效 。 在有效的600秒(10分鐘)內(nèi),如果連續(xù)120秒(2分鐘)未訪問(wèn)緩存,則緩存失效。 就算有訪問(wèn),也只會(huì)存活600秒。 --> <defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="600" timeToLiveSeconds="600" overflowToDisk="true" /> <!-- maxElementsInMemory,內(nèi)存緩存中最多可以存放的元素?cái)?shù)量,若放入Cache中的元素超過(guò)這個(gè)數(shù)值,則有以下兩種情況 1)若overflowToDisk=true,則會(huì)將Cache中多出的元素放入磁盤(pán)文件中 2)若overflowToDisk=false,則根據(jù)memoryStoreEvictionPolicy策略替換Cache中原有的元素 eternal, 緩存中對(duì)象是否永久有效 timeToIdleSeconds, 緩存數(shù)據(jù)在失效前的允許閑置時(shí)間(單位:秒),僅當(dāng)eternal=false時(shí)使用,默認(rèn)值是0表示可閑置時(shí)間無(wú)窮大,若超過(guò)這個(gè)時(shí)間沒(méi)有訪問(wèn)此Cache中的某個(gè)元素,那么此元素將被從Cache中清除 timeToLiveSeconds, 緩存數(shù)據(jù)的總的存活時(shí)間(單位:秒),僅當(dāng)eternal=false時(shí)使用,從創(chuàng)建開(kāi)始計(jì)時(shí),失效結(jié)束 maxElementsOnDisk, 磁盤(pán)緩存中最多可以存放的元素?cái)?shù)量,0表示無(wú)窮大 overflowToDisk, 內(nèi)存不足時(shí),是否啟用磁盤(pán)緩存 diskExpiryThreadIntervalSeconds, 磁盤(pán)緩存的清理線程運(yùn)行間隔,默認(rèn)是120秒 memoryStoreEvictionPolicy, 內(nèi)存存儲(chǔ)與釋放策略,即達(dá)到maxElementsInMemory限制時(shí),Ehcache會(huì)根據(jù)指定策略清理內(nèi)存 共有三種策略,分別為L(zhǎng)RU(最近最少使用)、LFU(最常用的)、FIFO(先進(jìn)先出) --> <cache name="user" maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" maxElementsOnDisk="10000000" overflowToDisk="true" memoryStoreEvictionPolicy="LRU" /> </ehcache>
<cache name="user"></cache>
,我們是可以配置多個(gè)來(lái)解決我們不同業(yè)務(wù)處所需要的緩存策略的
默認(rèn)情況下,EhCache 的配置文件名是固定的,ehcache.xml,如果需要更改文件名,需要在 application.yml 文件中指定配置文件位置,如:
spring: cache: type: ehcache ehcache: config: classpath:/ehcache.xml
指定了 EhCache 的配置文件位置
3、開(kāi)啟緩存
開(kāi)啟緩存的方式,也和 Redis 中一樣,在啟動(dòng)類上添加 @EnableCaching 注解即可:
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCaching; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @SpringBootApplication @EnableCaching public class SbmApplication { public static void main(String[] args) { SpringApplication.run(SbmApplication.class, args); } }
三、開(kāi)始使用
1、@CacheConfig
這個(gè)注解在類上使用,用來(lái)描述該類中所有方法使用的緩存名稱,當(dāng)然也可以不使用該注解,直接在具體的緩存注解上配置名稱,示例代碼如下:
@Service @CacheConfig(cacheNames = "user") public class UserServiceImpl implements UserService { }
2、@Cacheable
這個(gè)注解一般加在查詢方法上,表示將一個(gè)方法的返回值緩存起來(lái),默認(rèn)情況下,緩存的 key 就是方法的參數(shù),緩存的 value 就是方法的返回值。示例代碼如下:
@Override @Cacheable(value = "user", key = "#id") public User getUserById(Long id) { return userMapper.getUserById(id); }
如果在類上沒(méi)有加入 @CacheConfig,我們則需要使用 value 來(lái)指定緩存名稱
這里如果需要多個(gè) key 時(shí),需要使用 “:” 來(lái)連接,如:
@Cacheable(value = "user", key = "#name+':'+#phone")
3、@CachePut
這個(gè)注解一般加在更新方法上,當(dāng)數(shù)據(jù)庫(kù)中的數(shù)據(jù)更新后,緩存中的數(shù)據(jù)也要跟著更新,使用該注解,可以將方法的返回值自動(dòng)更新到已經(jīng)存在的 key 上,示例代碼如下:
@Override @CachePut(value = "user", key = "#id") public User updateUserById(User user) { return userMapper.updateUserById(user); }
4、@CacheEvict
這個(gè)注解一般加在刪除方法上,當(dāng)數(shù)據(jù)庫(kù)中的數(shù)據(jù)刪除后,相關(guān)的緩存數(shù)據(jù)也要自動(dòng)清除,該注解在使用的時(shí)候也可以配置按照某種條件刪除( condition 屬性)或者或者配置清除所有緩存( allEntries 屬性),示例代碼如下:
@Override @CacheEvict(value = "user", key = "#id") public void deleteUserById(Long id) { userMapper.deleteUserById(id); }
四、總結(jié)
SpringBoot 中使用 Ehcache 比較簡(jiǎn)單,只需要簡(jiǎn)單配置,說(shuō)白了還是 Spring Cache 的用法,合理使用緩存機(jī)制,可以很好地提高項(xiàng)目的響應(yīng)速度。
到此這篇關(guān)于SpringBoot中使用Ehcache的文章就介紹到這了,更多相關(guān)SpringBoot使用Ehcache內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java ArrayList中存放引用數(shù)據(jù)類型的方式
這篇文章主要介紹了Java ArrayList中存放引用數(shù)據(jù)類型的方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10使用Swagger2實(shí)現(xiàn)自動(dòng)生成RESTful?API文檔
在開(kāi)發(fā)?RESTful?API?的過(guò)程中,文檔是非常重要的一部分,可以幫助開(kāi)發(fā)者了解?API?的功能和使用方法,本文將使用Swagger2?實(shí)現(xiàn)自動(dòng)生成?RESTful?API?文檔,需要的可以參考一下2023-06-06Java實(shí)現(xiàn)讀取文章中重復(fù)出現(xiàn)的中文字符串
本文主要介紹了Java實(shí)現(xiàn)讀取文章中重復(fù)出現(xiàn)的中文字符串的方法。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-03-03Java中的StringTokenizer實(shí)現(xiàn)字符串切割詳解
這篇文章主要介紹了Java中的StringTokenizer實(shí)現(xiàn)字符串切割詳解,java.util工具包提供了字符串切割的工具類StringTokenizer,Spring等常見(jiàn)框架的字符串工具類(如Spring的StringUtils),需要的朋友可以參考下2024-01-01spring boot項(xiàng)目如何采用war在tomcat容器中運(yùn)行
這篇文章主要介紹了spring boot項(xiàng)目如何采用war在tomcat容器中運(yùn)行呢,主要講述將SpringBoot打成war包并放入tomcat中運(yùn)行的方法分享,需要的朋友可以參考下2022-11-11基于 SASL/SCRAM 讓 Kafka 實(shí)現(xiàn)動(dòng)態(tài)授權(quán)認(rèn)證的方法
在大數(shù)據(jù)處理和分析中?Apache Kafka?已經(jīng)成為了一個(gè)核心組件,本文將從零開(kāi)始部署?ZooKeeper?和?Kafka?并通過(guò)配置?SASL/SCRAM?和?ACL(訪問(wèn)控制列表)來(lái)增強(qiáng)?Kafka?的安全性,需要的朋友可以參考下2024-07-07