Spring整合Ehcache管理緩存

HilarioDown 8年前發布 | 39K 次閱讀 Ehcache Spring JEE框架

前言

Ehcache 是一個成熟的緩存框架,你可以直接使用它來管理你的緩存。

Spring 提供了對緩存功能的抽象:即允許綁定不同的緩存解決方案(如Ehcache),但本身不直接提供緩存功能的實現。它支持注解方式使用緩存,非常方便。

本文先通過Ehcache獨立應用的范例來介紹它的基本使用方法,然后再介紹與Spring整合的方法。

概述

Ehcache是什么?

EhCache 是一個純Java的進程內緩存框架,具有快速、精干等特點。它是Hibernate中的默認緩存框架。

Ehcache已經發布了3.1版本。但是本文的講解基于2.10.2版本。

為什么不使用最新版呢?因為Spring4還不能直接整合Ehcache 3.x。雖然可以通過JCache間接整合,Ehcache也支持JCache,但是個人覺得不是很方便。

安裝

Ehcache

如果你的項目使用maven管理,添加以下依賴到你的 pom.xml 中。

<dependency>
  <groupId>net.sf.ehcache</groupId>
  <artifactId>ehcache</artifactId>
  <version>2.10.2</version>
  <type>pom</type>
</dependency>

如果你的項目不使用maven管理,請在 Ehcache官網下載地址 下載jar包。

Spring

如果你的項目使用maven管理,添加以下依賴到你的 pom.xml 中。

spring-context-support 這個jar包中含有Spring對于緩存功能的抽象封裝接口。

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context-support</artifactId>
  <version>4.1.4.RELEASE</version>
</dependency>

Ehcache的使用

HelloWorld范例

接觸一種技術最快最直接的途徑總是一個Hello World例子,畢竟動手實踐印象更深刻,不是嗎?

(1) 在classpath下添加 ehcache.xml

添加一個名為 helloworld 的緩存。

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="

<!-- 默認緩存 --> <defaultCache maxEntriesLocalHeap="10000" eternal="false" timeToIdleSeconds="120" timeToLiveSeconds="120" maxEntriesLocalDisk="10000000" diskExpiryThreadIntervalSeconds="120" memoryStoreEvictionPolicy="LRU"/>

<!-- helloworld緩存 --> <cache name="helloworld" maxElementsInMemory="1000" eternal="false" timeToIdleSeconds="5" timeToLiveSeconds="5" overflowToDisk="false" memoryStoreEvictionPolicy="LRU"/> </ehcache></code></pre>

(2) EhcacheDemo.java

Ehcache會自動加載classpath根目錄下名為 ehcache.xml 文件。

EhcacheDemo的工作步驟如下:

在EhcacheDemo中,我們引用 ehcache.xml 聲明的名為 helloworld 的緩存來創建 Cache 對象;

然后我們用一個鍵值對來實例化 Element 對象;

將 Element 對象添加到 Cache ;

然后用 Cache 的get方法獲取 Element 對象。

public class EhcacheDemo {
    public static void main(String[] args) throws Exception {
        // Create a cache manager
        final CacheManager cacheManager = new CacheManager();

    // create the cache called "helloworld"
    final Cache cache = cacheManager.getCache("helloworld");

    // create a key to map the data to
    final String key = "greeting";

    // Create a data element
    final Element putGreeting = new Element(key, "Hello, World!");

    // Put the element into the data store
    cache.put(putGreeting);

    // Retrieve the data element
    final Element getGreeting = cache.get(key);

    // Print the value
    System.out.println(getGreeting.getObjectValue());
}

}</code></pre>

輸出

Hello, World!

Ehcache基本操作

Element 、 Cache 、 CacheManager 是Ehcache最重要的API。

  • Element:緩存的元素,它維護著一個鍵值對。
  • Cache:它是Ehcache的核心類,它有多個 Element ,并被 CacheManager 管理。它實現了對緩存的邏輯行為。
  • CacheManager: Cache 的容器對象,并管理著 Cache 的生命周期。

 

 

創建CacheManager

下面的代碼列舉了創建 CacheManager 的五種方式。

使用靜態方法 create() 會以默認配置來創建單例的 CacheManager 實例。

newInstance() 方法是一個工廠方法,以默認配置創建一個新的 CacheManager 實例。

此外, newInstance() 還有幾個重載函數,分別可以通過傳入 String 、 URL 、 InputStream 參數來加載配置文件,然后創建 CacheManager 實例。

// 使用Ehcache默認配置獲取單例的CacheManager實例
CacheManager.create();
String[] cacheNames = CacheManager.getInstance().getCacheNames();

// 使用Ehcache默認配置新建一個CacheManager實例 CacheManager.newInstance(); String[] cacheNames = manager.getCacheNames();

// 使用不同的配置文件分別創建一個CacheManager實例 CacheManager manager1 = CacheManager.newInstance("src/config/ehcache1.xml"); CacheManager manager2 = CacheManager.newInstance("src/config/ehcache2.xml"); String[] cacheNamesForManager1 = manager1.getCacheNames(); String[] cacheNamesForManager2 = manager2.getCacheNames();

// 基于classpath下的配置文件創建CacheManager實例 URL url = getClass().getResource("/anotherconfigurationname.xml"); CacheManager manager = CacheManager.newInstance(url);

// 基于文件流得到配置文件,并創建CacheManager實例 InputStream fis = new FileInputStream(new File ("src/config/ehcache.xml").getAbsolutePath()); try { CacheManager manager = CacheManager.newInstance(fis); } finally { fis.close(); }</code></pre>

添加緩存

需要強調一點, Cache 對象在用 addCache 方法添加到 CacheManager 之前,是無效的。

使用CacheManager的addCache方法可以根據緩存名將ehcache.xml中聲明的cache添加到容器中;它也可以直接將Cache對象添加到緩存容器中。

Cache 有多個構造函數,提供了不同方式去加載緩存的配置參數。

有時候,你可能需要使用API來動態的添加緩存,下面的例子就提供了這樣的范例。

// 除了可以使用xml文件中配置的緩存,你也可以使用API動態增刪緩存
// 添加緩存
manager.addCache(cacheName);

// 使用默認配置添加緩存 CacheManager singletonManager = CacheManager.create(); singletonManager.addCache("testCache"); Cache test = singletonManager.getCache("testCache");

// 使用自定義配置添加緩存,注意緩存未添加進CacheManager之前并不可用 CacheManager singletonManager = CacheManager.create(); Cache memoryOnlyCache = new Cache("testCache", 5000, false, false, 5, 2); singletonManager.addCache(memoryOnlyCache); Cache test = singletonManager.getCache("testCache");

// 使用特定的配置添加緩存 CacheManager manager = CacheManager.create(); Cache testCache = new Cache( new CacheConfiguration("testCache", maxEntriesLocalHeap) .memoryStoreEvictionPolicy(MemoryStoreEvictionPolicy.LFU) .eternal(false) .timeToLiveSeconds(60) .timeToIdleSeconds(30) .diskExpiryThreadIntervalSeconds(0) .persistence(new PersistenceConfiguration().strategy(Strategy.LOCALTEMPSWAP))); manager.addCache(testCache);</code></pre>

刪除緩存

刪除緩存比較簡單,你只需要將指定的緩存名傳入 removeCache 方法即可。

CacheManager singletonManager = CacheManager.create();
singletonManager.removeCache("sampleCache1");

實現基本緩存操作

Cache最重要的兩個方法就是put和get,分別用來添加Element和獲取Element。

Cache還提供了一系列的get、set方法來設置或獲取緩存參數,這里不一一列舉,更多API操作可參考 官方API開發手冊

/**

 本文由用戶 HilarioDown 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!