1. 程式人生 > 程式設計 >SpringBoot中使用Ehcache的詳細教程

SpringBoot中使用Ehcache的詳細教程

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 的依賴資訊

<!-- 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

<?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 檔案中指定配置檔案位置,如:

spring:
 cache:
 type: ehcache
 ehcache:
  config: classpath:/ehcache.xml

指定了 EhCache 的配置檔案位置

3、開啟快取

開啟快取的方式,也和 Redis 中一樣,在啟動類上新增 @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);
 }
}

三、開始使用

1、@CacheConfig

這個註解在類上使用,用來描述該類中所有方法使用的快取名稱,當然也可以不使用該註解,直接在具體的快取註解上配置名稱,示例程式碼如下:

@Service
@CacheConfig(cacheNames = "user")
public class UserServiceImpl implements UserService {

}

2、@Cacheable

這個註解一般加在查詢方法上,表示將一個方法的返回值快取起來,預設情況下,快取的 key 就是方法的引數,快取的 value 就是方法的返回值。示例程式碼如下:

@Override
@Cacheable(value = "user",key = "#id")
public User getUserById(Long id) {
 return userMapper.getUserById(id);
}

如果在類上沒有加入 @CacheConfig,我們則需要使用 value 來指定快取名稱
這裡如果需要多個 key 時,需要使用 “:” 來連線,如:

@Cacheable(value = "user",key = "#name+':'+#phone")

3、@CachePut

這個註解一般加在更新方法上,當資料庫中的資料更新後,快取中的資料也要跟著更新,使用該註解,可以將方法的返回值自動更新到已經存在的 key 上,示例程式碼如下:

@Override
@CachePut(value = "user",key = "#id")
public User updateUserById(User user) {
 return userMapper.updateUserById(user);
}

4、@CacheEvict

這個註解一般加在刪除方法上,當資料庫中的資料刪除後,相關的快取資料也要自動清除,該註解在使用的時候也可以配置按照某種條件刪除( condition 屬性)或者或者配置清除所有快取( allEntries 屬性),示例程式碼如下:

@Override
@CacheEvict(value = "user",key = "#id")
public void deleteUserById(Long id) {
 userMapper.deleteUserById(id);
}

四、總結

SpringBoot 中使用 Ehcache 比較簡單,只需要簡單配置,說白了還是 Spring Cache 的用法,合理使用快取機制,可以很好地提高專案的響應速度。

到此這篇關於SpringBoot中使用Ehcache的文章就介紹到這了,更多相關SpringBoot使用Ehcache內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!