學習Spring Boot:(二十一)使用 EhCache 實現數據緩存

前言

當屢次查詢數據庫影響到系統性能的時候,能夠考慮使用緩存,來解決數據訪問新能的問題。
SpringBoot 已經爲咱們提供了自動配置多個 CacheManager 的實現,只要去實現使用它就能夠了。css

通常的系統都是優先使用 EhCache,它工做在 JAVA 進程中,在傳統的應用沒有太大要求的時候,使用它比較方便,分佈式系統中去使用 Shiro 集中管理緩存。html

正文

加入依賴

在 pom.xml 中加入依賴java

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

添加緩存相關的配置

新建 ehcache.xml,加入緩存相關參數, 我新添加一個 name 爲 users 的緩存設置:spring

<?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/Tmp_EhCache"/>
    <defaultCache  maxElementsInMemory="1000" maxEntriesLocalHeap="400" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" overflowToDisk="false" diskPersistent="false" diskExpiryThreadIntervalSeconds="120"/>

    <cache  name="users" maxEntriesLocalHeap="200" timeToLiveSeconds="600" />

</ehcache>

參數詳解:數據庫

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

開啓緩存

  1. 在系統配置文件中指定
    在配置文件中加入指定咱們設置的 ehcache.xml 做爲 EhCache 的配置文件:
spring:
  cache:
    ehcache:
      config: config/ehcache.xml # 指定 ehcache.xml 建立EhCache的緩存管理器
    type: ehcache # 指定緩存管理器
  1. 在啓動類上加上註解 @EnableCaching,開啓緩存。

使用

使用的時候須要注意,咱們以前在 shiro 緩存中 配置了相關的緩存的配置,如今須要把 shiro 相關的緩存的內容所有都要刪除掉,否則二者的緩存會存在衝突。
仍是以 shiro 的獲取權限列表的服務爲例,不用 shiro-cache 後,直接在查詢的這裏本身添加上緩存就能夠了。數組

@CacheConfig(cacheNames = "users")
public interface ShiroService {
    /** * 獲取用戶權限 * * @param userId 用戶ID * @return 權限 */
    @Cacheable
    Set<String> getUserPermissions(long userId);

debug 調試,緩存

@Autowired
private CacheManager cacheManager;

發現 key 爲 users 中存儲了相關內容。springboot

註解的使用

  • @CacheConfig:主要用於配置該類中會用到的一些共用的緩存配置。在這裏@CacheConfig(cacheNames = "users"):配置了該數據訪問對象中返回的內容將存儲於名爲users的緩存對象中,咱們也能夠不使用該註解,直接經過@Cacheable本身配置緩存集的名字來定義。
  • @Cacheable:配置了getUserPermissions(long userId)函數的返回值將被加入緩存。同時在查詢時,會先從緩存中獲取,若不存在纔再發起對數據庫的訪問。該註解主要有下面幾個參數:
    1. valuecacheNames:兩個等同的參數(cacheNames爲Spring 4新增,做爲value的別名),用於指定緩存存儲的集合名。因爲Spring 4中新增了@CacheConfig,所以在Spring 3中本來必須有的value屬性,也成爲非必需項了。
    2. key:緩存對象存儲在Map集合中的key值,非必需,缺省按照函數的全部參數組合做爲key值,若本身配置需使用SpEL表達式,好比:@Cacheable(key = "#p0"):使用函數第一個參數做爲緩存的key值,更多關於SpEL表達式的詳細內容可參考官方文檔
    3. condition:緩存對象的條件,非必需,也需使用SpEL表達式,只有知足表達式條件的內容纔會被緩存,好比:@Cacheable(key = "#p0", condition = "#p0.length() < 3"),表示只有當第一個參數的長度小於3的時候纔會被緩存,
    4. unless:另一個緩存條件參數,非必需,需使用SpEL表達式。它不一樣於condition參數的地方在於它的判斷時機,該條件是在函數被調用以後才作判斷的,因此它能夠經過對result進行判斷。
    5. keyGenerator:用於指定key生成器,非必需。若須要指定一個自定義的key生成器,咱們須要去實現org.springframework.cache.interceptor.KeyGenerator接口,並使用該參數來指定。須要注意的是:該參數與key是互斥的
    6. cacheManager:用於指定使用哪一個緩存管理器,非必需。只有當有多個時才須要使用。
    7. cacheResolver:用於指定使用那個緩存解析器,非必需。需經過org.springframework.cache.interceptor.CacheResolver接口來實現本身的緩存解析器,並用該參數指定。

除了這裏用到的兩個註解以外,還有下面幾個核心註解:
* @CachePut:配置於函數上,可以根據參數定義條件來進行緩存,它與@Cacheable不一樣的是,它每次都會真是調用函數,因此主要用於數據新增和修改操做上。它的參數與@Cacheable相似,具體功能可參考上面對@Cacheable參數的解析
* @CacheEvict:配置於函數上,一般用在刪除方法上,用來從緩存中移除相應數據。除了同@Cacheable同樣的參數以外,它還有下面兩個參數:
1. allEntries:非必需,默認爲false。當爲true時,會移除全部數據
2. beforeInvocation:非必需,默認爲false,會在調用方法以後移除數據。當爲true時,會在調用方法以前移除數據。markdown

緩存配置

在Spring Boot中經過@EnableCaching註解自動化配置合適的緩存管理器(CacheManager),Spring Boot根據下面的順序去偵測緩存提供者:
1. Generic
2. JCache (JSR-107)
3. EhCache 2.x
4. Hazelcast
5. Infinispan
6. Redis
7. Guava
8. Simpleless

一般仍是推薦去指定一個 緩存類型比較好,在系統配置文件配置:

spring:
  cache:
    type: ehcache

參考文章

相關文章
相關標籤/搜索