1. 程式人生 > >【Cache】- Ehcache 基本操作

【Cache】- Ehcache 基本操作

浪費了“黃金五年”的Java程式設計師,還有救嗎? >>>   

Ehcache 結構層次: CacheManager、Cache、Element

這裡寫圖片描述

  • CacheManager:快取管理器,主要負責Cache物件的建立、回收等
  • Cache:主要負責Element元素的統一管理
  • Element:元素,可以理解成快取資料的小單元,每個單元都通過Map的形式進行儲存,是快取資料的實際攜帶者

基礎案例:

package com.zhiwei.ehcache;

import java.util.List;
import java.util.Map;
import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;

/**
 * CacheManager:快取管理器:負責Cache的建立、銷燬、回收等操作:一般只對應一個ehcache.xml檔案,避免衝突
 * Cache:快取物件:管理Element物件:一個cache對應多個element
 * element:實際快取資料的攜帶者
 * 
 * 注意:Ehcache3.0以上的版本的使用方式和這裡使用的2.1有些區別
 * @author Yang Zhiwei
 */

public class MainTest {
	
    @SuppressWarnings("unchecked")
	public static void main(String[] args) {
    	
    	//建立快取管理器的單例物件
        CacheManager manager = CacheManager.newInstance("src/com/zhiwei/ehcache/ehcache.xml");
        
          /**使用預設配置建立快取管理器
           *CacheManager defauleManager=manager.create();
           *System.out.println(defauleManager.getActiveConfigurationText());
          */
        
        //快取管理器獲取Cache物件,注意Cache物件需要在ehcaceh.xml進行配置
        Cache cache = manager.getCache("TestCache");
        System.out.println("TestCache記憶體回收策略:"+cache.getMemoryStoreEvictionPolicy().getName()); //獲取記憶體回收策略
        
        //建立攜帶資料的Element物件:如果某些引數指明則使用預設配置
        Element element01 = new Element("key01", "This is my first cache data!");
        Element element02 = new Element("key02","This is my second cache data!");
        System.out.println("預設快取空閒時間:"+element01.getTimeToIdle());
       
        //將資料存入快取
        cache.put(element01);
        cache.put(element02);
        
        //獲取element01快取元素的k-v
        Object key=  element01.getObjectKey();
        Object value = element01.getObjectValue();
        System.out.println("element01:"+key+"--"+value);
       
       //Cache管理Element物件
       Element element=cache.get("key01");
       System.err.println("自定義快取空閒時間:"+element.getTimeToIdle()); 
       
       List<String> keys=cache.getKeys();
       System.out.println("cache快取物件的keys:"+keys);
       //通過指定的key集合獲取快取資料物件
       Map<Object,Element> map=cache.getAll(keys);
       System.out.println(map);
       
       cache.flush();  //快取重新整理:將資料寫入本地磁碟
     
       System.out.println("快取元素個數:"+cache.getSize());  //獲取快取的資料塊個數
       
        cache.dispose(); //釋放快取cache管理的快取資料塊
        manager.removeAllCaches();  //快取管理器清空所有快取cache物件
        manager.shutdown();   //關閉快取管理器
    }
}

ehcache配置檔案:

<?xml version="1.0" encoding="UTF-8"?>
<ehcache>
    <!--磁碟快取本地目錄:JVM系統變數
    windows不同系統的路徑可能不一致,win10的路徑:
    C:\Users\squirrel\AppData\Local\Temp
    (可以通過System.getProperty("java.io.tmpdir")檢視)
-->
    <diskStore path="java.io.tmpdir"/>
    
    <!-- 
      maxEntriesLocalHeap:對記憶體最大快取個數:0標識無限制
      eternal:快取物件是否永久有效:優先順序比timeout高
      timeToIdleSeconds:空閒時間設定,過期直接銷燬
      timeToLiveSeconds:快取物件存活期
      maxEntriesLocalDisk:磁碟中的最大物件數:0標識無限制
      diskExpiryThreadIntervalSeconds:快取檢測事件間隔,定時處理已快取的資料元素
      diskSpoolBufferSizeMB:磁碟快取區大小
      memoryStoreEvictionPolicy:記憶體回收策略
        LRU:least recently used:最近最少使用
        LFU: least Frequently used:最少使用
        FIFO: First In First Out:先進先出:佇列形式
     -->
    <defaultCache
            maxEntriesLocalHeap="10000"
            eternal="false"
            timeToIdleSeconds="120"  
            timeToLiveSeconds="120"  
            diskSpoolBufferSizeMB="30"  
            maxEntriesLocalDisk="10000000"
            diskExpiryThreadIntervalSeconds="120"
            memoryStoreEvictionPolicy="LRU">
        <persistence strategy="localTempSwap"/>
    </defaultCache>
    
    <!-- 配置快取物件Cache:cachaManaget通過快取名稱獲取快取物件 -->
    <cache name="TestCache"
           maxEntriesLocalHeap="10000"
           maxEntriesLocalDisk="1000"
           eternal="false"
           diskSpoolBufferSizeMB="20"
           timeToIdleSeconds="300"
           timeToLiveSeconds="600"
           memoryStoreEvictionPolicy="LFU"
           transactionalMode="off">
        <persistence strategy="localTempSwap"/>
    </cache>
</ehcache>

結果:

TestCache記憶體回收策略:LFU
預設快取空閒時間:0
element01:key01--This is my first cache data!
自定義快取空閒時間:300
cache快取物件的keys:[key02, key01]
{key02=[ key = key02, value=This is my second cache data!, version=1, hitCount=1, CreationTime = 1482130695701, LastAccessTime = 1482130695701 ], key01=[ key = key01, value=This is my first cache data!, version=1, hitCount=2, CreationTime = 1482130695701, LastAccessTime = 1482130695701 ]}
快取元