SpringBoot 使用簡單的快取 -- ehcache
什麼是ehCache
EhCache 是一個純Java的程序內快取框架,具有快速、精幹等特點,是Hibernate中預設的CacheProvider。
一、具體描述
Ehcache是一個用Java實現的使用簡單,高速,實現執行緒安全的快取管理類庫,ehcache提供了用記憶體,磁碟檔案儲存,以及分散式儲存方式等多種靈活的cache管理方案。同時ehcache作為開放原始碼專案,採用限制比較寬鬆的Apache License V2.0作為授權方式,被廣泛地用於Hibernate, Spring,Cocoon等其他開源系統。Ehcache 從 Hibernate 發展而來,逐漸涵蓋了 Cahce 界的全部功能,是目前發展勢頭最好的一個專案。具有快速,簡單,低消耗,依賴性小,擴充套件性強,支援物件或序列化快取,支援快取或元素的失效,提供 LRU、LFU 和 FIFO 快取策略,支援記憶體快取和磁碟快取,分散式快取機制等等特點。
下圖是 Ehcache 在應用程式中的位置:
二、主要特性
快速、簡單;
多種快取策略;
快取資料有兩級:記憶體和磁碟,因此無需擔心容量問題;
快取資料會在虛擬機器重啟的過程中寫入磁碟;
可以通過 RMI、可插入 API 等方式進行分散式快取;
具有快取和快取管理器的偵聽介面;
支援多快取管理器例項,以及一個例項的多個快取區域;
提供 Hibernate 的快取實現;
配置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"
updateCheck="false">
<!-- 磁碟快取位置 -->
<diskStore path="java.io.tmpdir"/>
<!-- 預設快取 -->
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds ="120"
timeToLiveSeconds="120"
maxElementsOnDisk="10000000"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU">
<persistence strategy="localTempSwap"/>
</defaultCache>
<!-- 測試 -->
<cache name="userCache"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
maxEntriesLocalHeap="10000"
maxEntriesLocalDisk="10000000"
diskExpiryThreadIntervalSeconds="120"
overflowToDisk="false"
memoryStoreEvictionPolicy="LRU">
</cache>
</ehcache>
<!--<diskStore>==========當記憶體快取中物件數量超過maxElementsInMemory時,將快取物件寫到磁碟快取中(需物件實現序列化介面) -->
<!--<diskStore path="">==用來配置磁碟快取使用的物理路徑,Ehcache磁碟快取使用的檔案字尾名是*.data和*.index -->
<!--name=================快取名稱,cache的唯一標識(ehcache會把這個cache放到HashMap裡) -->
<!--maxElementsOnDisk====磁碟快取中最多可以存放的元素數量,0表示無窮大 -->
<!--maxElementsInMemory==記憶體快取中最多可以存放的元素數量,若放入Cache中的元素超過這個數值,則有以下兩種情況 -->
<!--1)若overflowToDisk=true,則會將Cache中多出的元素放入磁碟檔案中 -->
<!--2)若overflowToDisk=false,則根據memoryStoreEvictionPolicy策略替換Cache中原有的元素 -->
<!--eternal==============快取中物件是否永久有效,即是否永駐記憶體,true時將忽略timeToIdleSeconds和timeToLiveSeconds -->
<!--timeToIdleSeconds====快取資料在失效前的允許閒置時間(單位:秒),僅當eternal=false時使用,預設值是0表示可閒置時間無窮大,此為可選屬性 -->
<!--即訪問這個cache中元素的最大間隔時間,若超過這個時間沒有訪問此Cache中的某個元素,那麼此元素將被從Cache中清除 -->
<!--timeToLiveSeconds====快取資料在失效前的允許存活時間(單位:秒),僅當eternal=false時使用,預設值是0表示可存活時間無窮大 -->
<!--即Cache中的某元素從建立到清楚的生存時間,也就是說從建立開始計時,當超過這個時間時,此元素將從Cache中清除 -->
<!--overflowToDisk=======記憶體不足時,是否啟用磁碟快取(即記憶體中物件數量達到maxElementsInMemory時,Ehcache會將物件寫到磁碟中) -->
<!--會根據標籤中path值查詢對應的屬性值,寫入磁碟的檔案會放在path資料夾下,檔案的名稱是cache的名稱,字尾名是data -->
<!--diskPersistent=======是否持久化磁碟快取,當這個屬性的值為true時,系統在初始化時會在磁碟中查詢檔名為cache名稱,字尾名為index的檔案 -->
<!--這個檔案中存放了已經持久化在磁碟中的cache的index,找到後會把cache載入到記憶體 -->
<!--要想把cache真正持久化到磁碟,寫程式時注意執行net.sf.ehcache.Cache.put(Element element)後要呼叫flush()方法 -->
<!--diskExpiryThreadIntervalSeconds==磁碟快取的清理執行緒執行間隔,預設是120秒 -->
<!--diskSpoolBufferSizeMB============設定DiskStore(磁碟快取)的快取區大小,預設是30MB -->
<!--memoryStoreEvictionPolicy========記憶體儲存與釋放策略,即達到maxElementsInMemory限制時,Ehcache會根據指定策略清理記憶體 -->
<!--共有三種策略,分別為LRU(Least Recently Used 最近最少使用)、LFU(Less Frequently Used最不常用的)、FIFO(first in first out先進先出) -->
在SpringBoot中指定配置:
# 配置快取,記住型別要選ehcache,否則ehcache配置檔案中的配置將無效
spring.cache.type=ehcache
spring.cache.ehcache.config=classpath:ehcache.xml
接著便可以在服務類目使用快取了。
簡單使用如下:
@Service
@Slf4j
public class UserServiceImpl implements UserService {
/**
* The User mapper.
*/
@Autowired
UserMapper userMapper;
private final String cacheName = "userCache";
private final String cacheKey = "'user'";
//* @Cacheable : Spring在每次執行前都會檢查Cache中是否存在相同key的快取元素,如果存在就不再執行該方法,而是直接從快取中獲取結果進行返回,否則才會執行並將返回結果存入指定的快取中。
//* @CacheEvict : 清除快取。
//* @CachePut : @CachePut也可以宣告一個方法支援快取功能。使用@CachePut標註的方法在執行前不會去檢查快取中是否存在之前執行過的結果,而是每次都會執行該方法,並將執行結果以鍵值對的形式存入指定的快取中。
@Override
@Cacheable(value = cacheName, key = cacheKey)
public List<User> selectAll() {
log.info("未讀取快取");
return userMapper.findAll();
}
@Override
@CacheEvict(value = cacheName, key = cacheKey)
public Boolean insertUser(User user) {
return userMapper.insertSelective(user);
}
@Override
@Cacheable(value = cacheName, key = "'user_'+ #id")
public User selectById(long id) {
log.info("未讀取快取");
return userMapper.selectByPrimaryKey(id);
}
@Override
@CacheEvict(value = cacheName, key = cacheKey)
public Boolean updateUser(User user) {
return userMapper.updateByPrimaryKey(user);
}
@Override
@CacheEvict(value = cacheName, key = cacheKey)
public Boolean deleteUser(long id) {
return userMapper.deleteByPrimaryKey(id);
}
}
Demo原始碼已上傳至GitHub:https://github.com/liaozihong/SpringBoot-Learning/tree/master/SpringBoot-Mybatis-Ehcache