2.1EhCache

EhCache 是一個純Java的進程內緩存框架,具有快速、精干等特點,是Hibernate中默認的CacheProvider,和Spring也能很好的整合到一起

主要的特性有(來源于百度百科):

  1. 快速
  2. 簡單
  3. 多種緩存策略
  4. 緩存數據有兩級:內存和磁盤,因此無需擔心容量問題
  5. 緩存數據會在虛擬機重啟的過程中寫入磁盤
  6. 可以通過RMI、可插入API等方式進行分布式緩存
  7. 具有緩存和緩存管理器的偵聽接口
  8. 支持多緩存管理器實例,以及一個實例的多個緩存區域
  9. 提供Hibernate的緩存實現

這里面有兩個最主要,一個是在內存滿后可以緩存至磁盤,另一個是多緩存區域。

下面講一下具體使用

添加依賴

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

ehcache.xml配置文件

<?xml version="1.0" encoding="gbk"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd">
    <diskStore path="java.io.tmpdir"/>
    <defaultCache maxElementsInMemory="10000" eternal="false" timeToIdleSeconds="30" timeToLiveSeconds="30" overflowToDisk="false"/>
    <!-- 
            配置自定義緩存
            maxElementsInMemory:緩存中允許創建的最大對象數
            eternal:緩存中對象是否為永久的,如果是,超時設置將被忽略,對象從不過期。
            timeToIdleSeconds:緩存數據的鈍化時間,也就是在一個元素消亡之前,
                        兩次訪問時間的最大時間間隔值,這只能在元素不是永久駐留時有效,
                        如果該值是 0 就意味著元素可以停頓無窮長的時間。
            timeToLiveSeconds:緩存數據的生存時間,也就是一個元素從構建到消亡的最大時間間隔值,
                        這只能在元素不是永久駐留時有效,如果該值是0就意味著元素可以停頓無窮長的時間。
            overflowToDisk:內存不足時,是否啟用磁盤緩存。
            memoryStoreEvictionPolicy:緩存滿了之后的淘汰算法。
        -->
    <cache name="sysCache" 
        maxElementsInMemory="10"
        eternal="false"
        overflowToDisk="false" 
        timeToIdleSeconds="900" 
        timeToLiveSeconds="1800"
        memoryStoreEvictionPolicy="LFU" />
</ehcache>

這里是EhCache的配置文件,里面的注釋寫的非常清楚,最常用的幾個屬性也都寫清楚含義了。

EhCacheUtil工具類

private static volatile EhCacheUtil ehCacheUtil;
    private static volatile CacheManager cacheManager;
    private static Logger log = LoggerFactory.getLogger(EhCacheUtil.class);
    private static String confPath = "/ehcache.xml";//定義配置文件路徑

    public static EhCacheUtil getInstance() {
        if (null == ehCacheUtil) {
            synchronized (EhCacheUtil.class) {
                if (null == ehCacheUtil) {
                    ehCacheUtil = new EhCacheUtil();
                }
            }
        }
        return ehCacheUtil;
    }

    static {
        try {
            URL url = EhCacheUtil.class.getResource(confPath);
            cacheManager = CacheManager.create(url);
            log.info("ehcache初始化");
        } catch (Exception e) {
            e.printStackTrace();
            log.info("ehcache初始化失敗");
        }
    }

上面是利用單例模式初始化CacheManager

static Cache getOrAddCache(String cacheName) {
        Cache cache = cacheManager.getCache(cacheName);
        if (cache == null) {
            synchronized (cacheManager) {
                cache = cacheManager.getCache(cacheName);
                if (cache == null) {
                    log.warn("Could not find cache config [" + cacheName + "], using default.");
                    cacheManager.addCacheIfAbsent(cacheName);
                    cache = cacheManager.getCache(cacheName);
                    log.info("Cache [" + cacheName + "] started.");
                }
            }
        }
        return cache;
    }

根據cache的區域獲取對應的cache

 public static void put(String cacheName, Object key, Object value) {
        getOrAddCache(cacheName).put(new Element(key, value));
    }

    @SuppressWarnings("unchecked")
    public static <T> T get(String cacheName, Object key) {
        Element element = getOrAddCache(cacheName).get(key);
        return element != null ? (T) element.getObjectValue() : null;
    }

    @SuppressWarnings("rawtypes")
    public static List getKeys(String cacheName) {
        return getOrAddCache(cacheName).getKeys();
    }

    public static void remove(String cacheName, Object key) {
        getOrAddCache(cacheName).remove(key);
    }

    public static void removeAll(String cacheName) {
        getOrAddCache(cacheName).removeAll();
    }

這幾個方法就是把對象放入緩存,根據key來獲取緩存,按照區域清空緩存。

cache的使用

 public static void main(String[] args) {
        EhCacheUtil.put("sysCache", "cache", "Hello EhCache");
        String value = EhCacheUtil.get("sysCache", "cache");
        System.out.println(value);
    }

初始化一個sysCache的區域,key是cache,value是Hello EhCache

上面那個EhCacheUtil工具類可以直接用于實際開發,在實際開發中要配置自定義的緩存區域,這樣就可以直接清理這個區域,而不用一個一個key的去刪除。

源碼下載

[本工程詳細源碼]
(https://github.com/chykong/java_component/tree/master/chapter2_1_EhCache)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 一、簡介 Ehcache是一個用Java實現的使用簡單,高速,實現線程安全的緩存管理類庫,ehcache提供了用內...
    小程故事多閱讀 44,203評論 9 59
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 31,779評論 18 399
  • 理論總結 它要解決什么樣的問題? 數據的訪問、存取、計算太慢、太不穩定、太消耗資源,同時,這樣的操作存在重復性。因...
    jiangmo閱讀 2,948評論 0 11
  • Ehcache是現在最流行的純Java開源緩存框架,配置簡單、結構清晰、功能強大,最初知道它,是從Hibernat...
    安易學車閱讀 2,045評論 0 11
  • 原文連接:https://my.oschina.net/coolfire368/blog/123377 ehcac...
    晴天哥_王志閱讀 1,374評論 0 1