Spring Boot2 系列教程(三十)Spring Boot 整合 Ehcache

用慣了 Redis ,不少人已經忘記了還有另外一個緩存方案 Ehcache ,是的,在 Redis 一統江湖的時代,Ehcache 漸漸有點沒落了,不過,咱們仍是有必要了解下 Ehcache ,在有的場景下,咱們仍是會用到 Ehcache。html

<!--more-->java

今天鬆哥就來和你們聊聊 Spring Boot 中使用 Ehcache 的狀況。相信看完本文,你們對於[Spring Boot2 系列教程(二十六)Spring Boot 整合 Redis]一文中的第二種方案會有更加深入的理解。git

Ehcache 也是 Java 領域比較優秀的緩存方案之一,Ehcache 這個緩存的名字頗有意思,正着念反着念,都是 Ehcache,Spring Boot 中對此也提供了很好的支持,這個支持主要是經過 Spring Cache 來實現的。github

Spring Cache 能夠整合 Redis,固然也能夠整合 Ehcache,兩種緩存方案的整合仍是比較類似,主要是配置的差別,具體的用法是如出一轍的,就相似於 JDBC 和 數據庫驅動的關係同樣。前面配置完成後,後面具體使用的 API 都是同樣的。web

和 Spring Cache + Redis 相比,Spring Cache + Ehcache 主要是配置有所差別,具體的用法是如出一轍的。咱們來看下使用步驟。spring

項目建立

首先,來建立一個 Spring Boot 項目,引入 Cache 依賴:數據庫

工程建立完成後,引入 Ehcache 的依賴,Ehcache 目前有兩個版本:緩存

這裏採用第二個,在 pom.xml 文件中,引入 Ehcache 依賴:app

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-cache</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>net.sf.ehcache</groupId>
        <artifactId>ehcache</artifactId>
        <version>2.10.6</version>
    </dependency>
</dependencies>

添加 Ehcache 配置

在 resources 目錄下,添加 ehcache 的配置文件 ehcache.xml ,文件內容以下:ide

<ehcache>
    <diskStore path="java.io.tmpdir/shiro-spring-sample"/>
    <defaultCache
            maxElementsInMemory="10000"
            eternal="false"
            timeToIdleSeconds="120"
            timeToLiveSeconds="120"
            overflowToDisk="false"
            diskPersistent="false"
            diskExpiryThreadIntervalSeconds="120"
    />
    <cache name="user"
            maxElementsInMemory="10000"
            eternal="true"
            overflowToDisk="true"
            diskPersistent="true"
            diskExpiryThreadIntervalSeconds="600"/>
</ehcache>

配置含義:

  1. name:緩存名稱。
  2. maxElementsInMemory:緩存最大個數。
  3. eternal:對象是否永久有效,一但設置了,timeout將不起做用。
  4. timeToIdleSeconds:設置對象在失效前的容許閒置時間(單位:秒)。僅當eternal=false對象不是永久有效時使用,可選屬性,默認值是0,也就是可閒置時間無窮大。
  5. timeToLiveSeconds:設置對象在失效前容許存活時間(單位:秒)。最大時間介於建立時間和失效時間之間。僅當eternal=false對象不是永久有效時使用,默認是0.,也就是對象存活時間無窮大。
  6. overflowToDisk:當內存中對象數量達到maxElementsInMemory時,Ehcache將會對象寫到磁盤中。
  7. diskSpoolBufferSizeMB:這個參數設置DiskStore(磁盤緩存)的緩存區大小。默認是30MB。每一個Cache都應該有本身的一個緩衝區。
  8. maxElementsOnDisk:硬盤最大緩存個數。
  9. diskPersistent:是否緩存虛擬機重啓期數據。
  10. diskExpiryThreadIntervalSeconds:磁盤失效線程運行時間間隔,默認是120秒。
  11. memoryStoreEvictionPolicy:當達到maxElementsInMemory限制時,Ehcache將會根據指定的策略去清理內存。默認策略是LRU(最近最少使用)。你能夠設置爲FIFO(先進先出)或是LFU(較少使用)。
  12. clearOnFlush:內存數量最大時是否清除。
  13. diskStore 則表示臨時緩存的硬盤目錄。

注意

默認狀況下,這個文件名是固定的,必須叫 ehcache.xml ,若是必定要換一個名字,那麼須要在 application.properties 中明確指定配置文件名,配置方式以下:

spring.cache.ehcache.config=classpath:aaa.xml

開啓緩存

開啓緩存的方式,也和 Redis 中同樣,以下添加 @EnableCaching 依賴便可:

@SpringBootApplication
@EnableCaching
public class EhcacheApplication {
    public static void main(String[] args) {
        SpringApplication.run(EhcacheApplication.class, args);
    }
}

其實到這一步,Ehcache 就算配置完成了,接下來的用法,和鬆哥以前講 Redis 的文章如出一轍。不過這裏鬆哥仍是帶你們使用下。

使用緩存

這裏主要向小夥伴們介紹緩存中幾個核心的註解使用。

@CacheConfig

這個註解在類上使用,用來描述該類中全部方法使用的緩存名稱,固然也能夠不使用該註解,直接在具體的緩存註解上配置名稱,示例代碼以下:

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

@Cacheable

這個註解通常加在查詢方法上,表示將一個方法的返回值緩存起來,默認狀況下,緩存的 key 就是方法的參數,緩存的 value 就是方法的返回值。示例代碼以下:

@Cacheable(key = "#id")
public User getUserById(Integer id,String username) {
    System.out.println("getUserById");
    return getUserFromDBById(id);
}

當有多個參數時,默認就使用多個參數來作 key ,若是隻須要其中某一個參數作 key ,則能夠在 @Cacheable 註解中,經過 key 屬性來指定 key ,如上代碼就表示只使用 id 做爲緩存的 key ,若是對 key 有複雜的要求,能夠自定義 keyGenerator 。固然,Spring Cache 中提供了root對象,能夠在不定義 keyGenerator 的狀況下實現一些複雜的效果,root 對象有以下屬性:

也能夠經過 keyGenerator 自定義 key ,方式以下:

@Component
public class MyKeyGenerator implements KeyGenerator {
    @Override
    public Object generate(Object target, Method method, Object... params) {
        return method.getName()+Arrays.toString(params);
    }
}

而後在方法上使用該 keyGenerator :

@Cacheable(keyGenerator = "myKeyGenerator")
public User getUserById(Long id) {
    User user = new User();
    user.setId(id);
    user.setUsername("lisi");
    System.out.println(user);
    return user;
}

@CachePut

這個註解通常加在更新方法上,當數據庫中的數據更新後,緩存中的數據也要跟着更新,使用該註解,能夠將方法的返回值自動更新到已經存在的 key 上,示例代碼以下:

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

@CacheEvict

這個註解通常加在刪除方法上,當數據庫中的數據刪除後,相關的緩存數據也要自動清除,該註解在使用的時候也能夠配置按照某種條件刪除( condition 屬性)或者或者配置清除全部緩存( allEntries 屬性),示例代碼以下:

@CacheEvict()
public void deleteUserById(Integer id) {
    //在這裏執行刪除操做, 刪除是去數據庫中刪除
}

總結

本文主要向你們了 Spring Boot 整合 Ehcache 的用法,其實說白了仍是 Spring Cache 的用法。相信讀完本文,你們對於 Redis + Spring Cache 的用法會有更深的認識。

本文案例我已上傳到 GitHub ,歡迎你們 star:https://github.com/lenve/javaboy-code-samples

關於本文,有問題歡迎留言討論。

掃碼關注鬆哥,公衆號後臺回覆 2TB,獲取鬆哥獨家 超2TB 免費 Java 學習乾貨

原文出處:https://www.cnblogs.com/lenve/p/12015048.html

相關文章
相關標籤/搜索