1. 程式人生 > >SpringBoot 使用簡單的快取 -- ehcache

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