簡述
EhCache 是一個純Java的分佈式的進程內緩存框架,具有快速、精幹等特點,主要面向通用緩存,Java EE和輕量級容器。它具有內存和磁盤存儲,緩存加載器,緩存擴展,緩存異常處理程序,一個gzip緩存servlet過濾器,支持REST和SOAP api等特點,是Hibernate中默認的CacheProvider;
-
在 Spring Boot中,通過@EnableCaching註解自動化配置合適的緩存管理器
-
關於 Spring Boot 的緩存機制:
高速緩存抽象不提供實際存儲,並且依賴於由org.springframework.cache.Cache和org.springframework.cache.CacheManager接口實現的抽象。 Spring Boot根據實現自動配置合適的CacheManager,只要緩存支持通過@EnableCaching註釋啓用即可。 -
特點
(1)快速簡單,具有多種緩存策略
(2)緩存數據有兩級爲內存和磁盤,緩存數據會在虛擬機重啓的過程中寫入磁盤
(3)可以通過RMI、可插入API等方式進行分佈式緩存
(4)具有緩存和緩存管理器的偵聽接口
(5)支持多緩存管理器實例,以及一個實例的多個緩存區域。並提供Hibernate的緩存實現
(6)Ehcache有緩存共享方案,不過是通過RMI或者Jgroup多播方式進行廣播緩存通知更新,緩存共享複雜,維護不方便;簡單的共享可以,但是涉及到緩存恢復,大數據緩存,則不合適
環境搭建
- 依賴
<!--開啓 cache 緩存-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<!-- ehcache 緩存 -->
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache</artifactId>
</dependency>
- 配置文件(eccache.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"
updateCheck="false">
//默認緩存策略,當ehcache找不到定義的緩存時,則使用這個緩存策略。只能定義一個。
<defaultCache
//對象是否永久有效,一但設置了,timeout將不起作用。
eternal="false"
//內存緩存最大數目
maxElementsInMemory="1000"
//硬盤最大緩存個數
maxElementsOnDisk="5000"
//是否保存到磁盤,當系統宕機時
overflowToDisk="false"
//是否緩存虛擬機重啓期數據
diskPersistent="false"
//設置對象在失效前的允許閒置時間(單位:秒)。僅當eternal=false對象不是永久有效時使用,可選屬性,默認值是0,也就是可閒置時間無窮大。
timeToIdleSeconds="0"
//設置對象在失效前允許存活時間(單位:秒)。最大時間介於創建時間和失效時間之間。僅當eternal=false對象不是永久有效時使用,默認是0.,也就是對象存活時間無窮大。
timeToLiveSeconds="600"
//當達到緩存最大值限制時,緩存清除策略
memoryStoreEvictionPolicy="LRU" />
<!-- 這裏以example爲例 -->
<cache
//緩存名稱
name="example"
eternal="false"
maxElementsInMemory="100"
overflowToDisk="false"
diskPersistent="false"
timeToIdleSeconds="0"
timeToLiveSeconds="300"
memoryStoreEvictionPolicy="LRU" />
</ehcache>
diskStore:爲緩存路徑,ehcache分爲內存和磁盤兩級,此屬性定義磁盤的緩存位置。
diskSpoolBufferSizeMB:這個參數設置DiskStore(磁盤緩存)的緩存區大小。默認是30MB。每個Cache都應該有自己的一個緩衝區。
diskExpiryThreadIntervalSeconds:磁盤失效線程運行時間間隔,默認是120秒。
clearOnFlush:內存數量最大時是否清除。
memoryStoreEvictionPolicy:可選策略有:LRU(最近最少使用,默認策略)、FIFO(先進先出)、LFU(最少訪問次數)。
項目使用
- springboot支持的註解
1:@Cacheable : Spring在每次執行前都會檢查Cache中是否存在相同key的緩存元素,如果存在就不再執行該方法,而是直接從緩存中獲取結果進行返回,否則纔會執行並將返回結果存入指定的緩存中。
2:@CacheEvict : 清除緩存。
3: @CachePut : @CachePut也可以聲明一個方法支持緩存功能。使用@CachePut標註的方法在執行前不會去檢查緩存中是否存在之前執行過的結果,而是每次都會執行該方法,並將執行結果以鍵值對的形式存入指定的緩存中。 - 這三個方法中都有兩個主要的屬性:value 指的是 ehcache.xml 中的緩存策略空間(name屬性);key 指的是緩存的標識,同時可以用 # 來引用參數。
與其他緩存比較
- ehcache和redis有什麼區別
前者操作簡單易使用,存取速度快,效率更高但是不適合大型的分佈式集羣部署。而後者更適合用於大數據緩存,數據恢復等。