EhCache 是一個純 Java 的進程內緩存框架,具有快速、精干等特點,是 Hibernate 中默認的 CacheProvider。用慣了 Redis,很多人可能已經忘記了還有 EhCache 這么一個緩存框架
一、簡介
EhCache 是一個純 Java 的進程內緩存框架,具有快速、精干等特點,是 Hibernate 中默認CacheProvider。Ehcache 是一種廣泛使用的開源 Java 分布式緩存。主要面向通用緩存,Java EE 和輕量級容器。它具有內存和磁盤存儲,緩存加載器,緩存擴展,緩存異常處理程序,一個 gzip 緩存 servlet 過濾器,支持 REST 和 SOAP api 等特點。
特性
- 快速、簡單
- 多種緩存策略
- 緩存數據有兩級:內存和磁盤,因此無需擔心容量問題
- 緩存數據會在虛擬機重啟的過程中寫入磁盤
- 可以通過RMI、可插入API等方式進行分布式緩存
- 具有緩存和緩存管理器的偵聽接口
- 支持多緩存管理器實例,以及一個實例的多個緩存區域
- 提供Hibernate的緩存實現
與 Redis 相比
- EhCache 直接在jvm虛擬機中緩存,速度快,效率高;但是緩存共享麻煩,集群分布式應用不方便。
- Redis 是通過 Socket 訪問到緩存服務,效率比 EhCache 低,比數據庫要快很多,處理集群和分布式緩存方便,有成熟的方案。如果是單個應用或者對緩存訪問要求很高的應用,用 EhCache 。如果是大型系統,存在緩存共享、分布式部署、緩存內容很大的,建議用 Redis。
- EhCache 也有緩存共享方案,不過是通過 RMI 或者 Jgroup 多播方式進行廣播緩存通知更新,緩存共享復雜,維護不方便;簡單的共享可以,但是涉及到緩存恢復,大數據緩存,則不合適。
二、引入 EhCache
1、引入依賴
在 pom.xml 文件中,引入 Ehcache 的依賴信息
1
2
3
4
5
6
7
8
9
10
|
<!-- 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、配置文件
創建 EhCache 的配置文件: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
49
50
51
52
53
|
<?xml version= "1.0" encoding= "UTF-8" ?> <ehcache xmlns:xsi= "http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation= "http://ehcache.org/ehcache.xsd" > <!-- 磁盤存儲:將緩存中暫時不使用的對象,轉移到硬盤,類似于Windows系統的虛擬內存 path:指定在硬盤上存儲對象的路徑 path可以配置的目錄有: user.home(用戶的家目錄) user.dir(用戶當前的工作目錄) java.io.tmpdir(默認的臨時目錄) ehcache.disk.store.dir(ehcache的配置目錄) 絕對路徑(如:d:\\ehcache) 查看路徑方法:String tmpDir = System.getProperty( "java.io.tmpdir" ); --> <diskStore path= "java.io.tmpdir" /> <!-- defaultCache:默認的緩存配置信息,如果不加特殊說明,則所有對象按照此配置項處理 maxElementsInMemory:設置了緩存的上限,最多存儲多少個記錄對象 eternal:代表對象是否永不過期 (指定 true 則下面兩項配置需為 0 無限期) timeToIdleSeconds:最大的發呆時間 /秒 timeToLiveSeconds:最大的存活時間 /秒 overflowToDisk:是否允許對象被寫入到磁盤 說明:下列配置自緩存建立起 600 秒( 10 分鐘)有效 。 在有效的 600 秒( 10 分鐘)內,如果連續 120 秒( 2 分鐘)未訪問緩存,則緩存失效。 就算有訪問,也只會存活 600 秒。 --> <defaultCache maxElementsInMemory= "10000" eternal= "false" timeToIdleSeconds= "600" timeToLiveSeconds= "600" overflowToDisk= "true" /> <!-- maxElementsInMemory,內存緩存中最多可以存放的元素數量,若放入Cache中的元素超過這個數值,則有以下兩種情況 1 )若overflowToDisk= true ,則會將Cache中多出的元素放入磁盤文件中 2 )若overflowToDisk= false ,則根據memoryStoreEvictionPolicy策略替換Cache中原有的元素 eternal, 緩存中對象是否永久有效 timeToIdleSeconds, 緩存數據在失效前的允許閑置時間(單位:秒),僅當eternal= false 時使用,默認值是 0 表示可閑置時間無窮大,若超過這個時間沒有訪問此Cache中的某個元素,那么此元素將被從Cache中清除 timeToLiveSeconds, 緩存數據的總的存活時間(單位:秒),僅當eternal= false 時使用,從創建開始計時,失效結束 maxElementsOnDisk, 磁盤緩存中最多可以存放的元素數量, 0 表示無窮大 overflowToDisk, 內存不足時,是否啟用磁盤緩存 diskExpiryThreadIntervalSeconds, 磁盤緩存的清理線程運行間隔,默認是 120 秒 memoryStoreEvictionPolicy, 內存存儲與釋放策略,即達到maxElementsInMemory限制時,Ehcache會根據指定策略清理內存 共有三種策略,分別為LRU(最近最少使用)、LFU(最常用的)、FIFO(先進先出) --> <cache name= "user" maxElementsInMemory= "10000" eternal= "false" timeToIdleSeconds= "120" timeToLiveSeconds= "120" maxElementsOnDisk= "10000000" overflowToDisk= "true" memoryStoreEvictionPolicy= "LRU" /> </ehcache> |
<cache name="user"></cache>
,我們是可以配置多個來解決我們不同業務處所需要的緩存策略的
默認情況下,EhCache 的配置文件名是固定的,ehcache.xml,如果需要更改文件名,需要在 application.yml 文件中指定配置文件位置,如:
1
2
3
4
5
|
spring: cache: type: ehcache ehcache: config: classpath:/ehcache.xml |
指定了 EhCache 的配置文件位置
3、開啟緩存
開啟緩存的方式,也和 Redis 中一樣,在啟動類上添加 @EnableCaching 注解即可:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
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); } } |
三、開始使用
1、@CacheConfig
這個注解在類上使用,用來描述該類中所有方法使用的緩存名稱,當然也可以不使用該注解,直接在具體的緩存注解上配置名稱,示例代碼如下:
1
2
3
4
5
|
@Service @CacheConfig (cacheNames = "user" ) public class UserServiceImpl implements UserService { } |
2、@Cacheable
這個注解一般加在查詢方法上,表示將一個方法的返回值緩存起來,默認情況下,緩存的 key 就是方法的參數,緩存的 value 就是方法的返回值。示例代碼如下:
1
2
3
4
5
|
@Override @Cacheable (value = "user" , key = "#id" ) public User getUserById(Long id) { return userMapper.getUserById(id); } |
如果在類上沒有加入 @CacheConfig,我們則需要使用 value 來指定緩存名稱
這里如果需要多個 key 時,需要使用 “:” 來連接,如:
1
|
@Cacheable (value = "user" , key = "#name+':'+#phone" ) |
3、@CachePut
這個注解一般加在更新方法上,當數據庫中的數據更新后,緩存中的數據也要跟著更新,使用該注解,可以將方法的返回值自動更新到已經存在的 key 上,示例代碼如下:
1
2
3
4
5
|
@Override @CachePut (value = "user" , key = "#id" ) public User updateUserById(User user) { return userMapper.updateUserById(user); } |
4、@CacheEvict
這個注解一般加在刪除方法上,當數據庫中的數據刪除后,相關的緩存數據也要自動清除,該注解在使用的時候也可以配置按照某種條件刪除( condition 屬性)或者或者配置清除所有緩存( allEntries 屬性),示例代碼如下:
1
2
3
4
5
|
@Override @CacheEvict (value = "user" , key = "#id" ) public void deleteUserById(Long id) { userMapper.deleteUserById(id); } |
四、總結
SpringBoot 中使用 Ehcache 比較簡單,只需要簡單配置,說白了還是 Spring Cache 的用法,合理使用緩存機制,可以很好地提高項目的響應速度。
到此這篇關于SpringBoot中使用Ehcache的文章就介紹到這了,更多相關SpringBoot使用Ehcache內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://blog.csdn.net/qq_40065776/article/details/107560607