關於springboot使用快取機制的方法
阿新 • • 發佈:2018-11-22
EhCache 的優缺點
優點:
- 快速,簡單,多種快取策略
- 快取資料有兩級:記憶體和磁碟,因此無需擔心容量問題
- 快取資料會在虛擬機器重啟的過程中寫入磁碟
- 可以通過RMI、可插入API等方式進行分散式快取
- 具有快取和快取管理器的偵聽介面
- 支援多快取管理器例項,以及一個例項的多個快取區域
- 提供Hibernate的快取實現
缺點:
- 使用磁碟Cache的時候非常佔用磁碟空間:這是因為DiskCache的演算法簡單,該演算法簡單也導致Cache的效率非常高。它只是對元素直接追加儲存。因此搜尋元素的時候非常的快。如果使用DiskCache的,在很頻繁的應用中,很快磁碟會滿。
- 不能保證資料的安全:當突然kill掉java的時候,可能會產生衝突,EhCache的解決方法是如果檔案衝突了,則重建cache。這對於Cache 資料需要儲存的時候可能不利。當然,Cache只是簡單的加速,而不能保證資料的安全。如果想保證資料的儲存安全,可以使用Bekeley DB Java Edition版本。這是個嵌入式資料庫。可以確保儲存安全和空間的利用率。
1、Springboot+Mybatis專案的構建
https://blog.csdn.net/u010158540/article/details/79986760
ps:這裡是使用idea開發工具構建springboot專案
2、在pom.xml中加入ehcache快取依賴包
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache-core</artifactId>
<version>2.6.11</version>
</dependency>
echcache的屬性
name:快取名稱 maxElementsInMemory:記憶體中最大快取物件數 maxElementsOnDisk:硬碟中最大快取物件數,若是0表示無窮大 eternal:true表示物件永不過期,此時會忽略timeToIdleSeconds和timeToLiveSeconds屬性,預設為false overflowToDisk:true表示當記憶體快取的物件數目達到了maxElementsInMemory界限後,會把溢位的物件寫到硬碟快取中。注意:如果快取的物件要寫入到硬碟中的話,則該物件必須實現了Serializable接口才行。 diskSpoolBufferSizeMB:磁碟快取區大小,預設為30MB。每個Cache都應該有自己的一個快取區。 diskPersistent:是否快取虛擬機器重啟期資料 diskExpiryThreadIntervalSeconds:磁碟失效執行緒執行時間間隔,預設為120秒 timeToIdleSeconds: 設定允許物件處於空閒狀態的最長時間,以秒為單位。當物件自從最近一次被訪問後,如果處於空閒狀態的時間超過了timeToIdleSeconds屬性值,這個物件就會過期,EHCache將把它從快取中清空。只有當eternal屬性為false,該屬性才有效。如果該屬性值為0,則表示物件可以無限期地處於空閒狀態 timeToLiveSeconds:設定物件允許存在於快取中的最長時間,以秒為單位。當物件自從被存放到快取中後,如果處於快取中的時間超過了 timeToLiveSeconds屬性值,這個物件就會過期,EHCache將把它從快取中清除。只有當eternal屬性為false,該屬性才有效。如果該屬性值為0,則表示物件可以無限期地存在於快取中。timeToLiveSeconds必須大於timeToIdleSeconds屬性,才有意義 memoryStoreEvictionPolicy:當達到maxElementsInMemory限制時,Ehcache將會根據指定的策略去清理記憶體。可選策略有:LRU(最近最少使用,預設策略)、FIFO(先進先出)、LFU(最少訪問次數)。
3、在resources靜態資源包中加入ehcache-setting.xml配置檔案
<?xml version="1.0" encoding="UTF-8"?>
<ehcache>
<!-- 指定一個檔案目錄,當EhCache把資料寫到硬碟上時,將把資料寫到這個檔案目錄下 -->
<diskStore path="${java.io.tmpdir}/ehcache/sq" />
<!-- 設定快取的預設資料過期策略 -->
<defaultCache maxElementsInMemory="10000" eternal="false"
overflowToDisk="true" timeToIdleSeconds="10" timeToLiveSeconds="20"
diskPersistent="false" diskExpiryThreadIntervalSeconds="120" />
<!-- 配置說明: timeToIdleSeconds:如果客戶的訪問授權15分鐘內沒有被使用過,則從快取中清空。 -->
<cache name="baseCache" maxElementsInMemory="1000" eternal="false"
timeToLiveSeconds="7"
overflowToDisk="false"
memoryStoreEvictionPolicy="LRU"/>
</ehcache>
<!--這裡的sqlCache對應>
4、建立一個ehcache的包,並建立一個類名為CacheConfigure.java
import org.springframework.cache.ehcache.EhCacheManagerFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.core.io.ClassPathResource;
public class CacheConfiguration {
/*
* ehcache 主要的管理器
*/
@Bean(name = "appEhCacheCacheManager")
public EhCacheCacheManager ehCacheCacheManager(EhCacheManagerFactoryBean bean){
return new EhCacheCacheManager (bean.getObject ());
}
/*
* 據shared與否的設定,Spring分別通過CacheManager.create()或new CacheManager()方式來建立一個ehcache基地.
*/
@Bean
public EhCacheManagerFactoryBean ehCacheManagerFactoryBean(){
EhCacheManagerFactoryBean cacheManagerFactoryBean = new EhCacheManagerFactoryBean ();
cacheManagerFactoryBean.setConfigLocation (new ClassPathResource("ehcache-setting.xml"));
cacheManagerFactoryBean.setShared (true);
return cacheManagerFactoryBean;
}
}
ps:這裡的ehcache-setting.xml檔名必須與resources資源包中建立的xml檔名一致!
5、在springboot啟動檔案中掃描ehcache包
6、最後就可以在需要的地方加上@Cacheable註解
ps:@Cacheable註解的value對應ehcache-setting.xml配置檔案中的快取name
ps:下一次執行方法時,就會直接從快取裡面取,不用再次執行該方法,避免多次重複操作,佔用系統資源。
這就是springboot整合ehcache快取機制,希望對你有所幫助!
在使用ehcache中需要注意的幾點: