EhCache緩存使用教程


文章發表在我的博客上:https://blog.ysboke.cn/archives/124.html

什么是ehcache

純Java的進程內緩存,直接在JVM虛擬機中緩存,速度非常快。緩存有兩級,內存存儲完了自動存到磁盤上。

數據可持久化在磁盤上,vm(虛擬機)重啟后數據恢復

和redis比怎么樣

redis都聽過,內存數據庫,ehcache的緩存是jvm級別的,速度超過redis。redis通過socket訪問緩存數據,效率沒ehcache高。

對於分布式和集群,redis有成熟的方案,而ehcache在分布式和集群情況下的緩存恢復、數據緩存的支持不是很好。

如果是大型系統,存在緩存共享、分布式部署、緩存內容很大的,建議用redis。

二者可以共同使用。

使用方法

1、在pom.xml里添加依賴:

        <!--引入Mybatis的ehCache的適配-->
        <dependency>
            <groupId>org.mybatis.caches</groupId>
            <artifactId>mybatis-ehcache</artifactId>
            <version>1.0.3</version>
        </dependency>

2、在src/main/java/resources下創建固定名稱的ehcache.xml文件:

<?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"
         monitoring="autodetect"
         dynamicConfig="true">
	<!-- 當內存中不夠存儲時,存儲到指定數據在磁盤中的存儲位置。 -->
    <diskStore path="cache" />
    
	<!-- 默認緩存,當借助CacheManager.add("demoCache")創建Cache時,EhCache便會采用<defalutCache/>指定的的管理策略 -->
    <defaultCache
            maxElementsInMemory="3000"
            eternal="false"
            copyOnRead="true"
            copyOnWrite="true"
            timeToIdleSeconds="3600"
            timeToLiveSeconds="3600"
            overflowToDisk="true"
            diskPersistent="true">
        <copyStrategy class="com.moti.utils.MyCopyStrategy"/>
    </defaultCache>
    
        <!-- 自定義的緩存策略 -->
    <cache name="HelloWorldCache"
           maxElementsInMemory="1000"
           eternal="false"
           timeToIdleSeconds="5"
           timeToLiveSeconds="5"
           overflowToDisk="false"
           memoryStoreEvictionPolicy="LRU"/>
    
</ehcache>

必須的屬性:

  • maxElementsInmemory—— 在內存中緩存的element的最大數目
  • maxElementsOnDisk——在磁盤上緩存的elements的最大數目,0表示不限制
  • eternal——設定緩存的elements是否永遠不過期。如果為true,則緩存的數據始終有效,如果為false那么還要根據timeToIdleSeconds,timeToLiveSeconds判斷
  • overFlowToDisk——設定當內存緩存溢出的時候是否將過期的element緩存到磁盤上

可選的屬性:

  • timeToIdleSeconds——可閑置時間。當緩存在EhCache中的數據前后兩次訪問的時間超過timeToIdleSeconds的屬性取值時,這些數據便會刪除,默認值是0,也就是可閑置時間無窮大
  • timeToLiveSeconds——緩存element的有效生命期,默認是0。也就是element存活時間無窮大
  • diskSpoolBufferSizeMB——設置DiskStore(磁盤緩存)的緩存區大小.默認是30MB.每個Cache都應該有自己的一個緩沖區.
  • diskPersistent——在VM重啟的時候是否啟用磁盤保存EhCache中的數據,默認是false。
  • diskExpiryThreadIntervalSeconds——磁盤緩存的清理線程運行間隔,默認是120秒。每個120s,相應的線程會進行一次EhCache中數據的清理工作
  • memoryStoreEvictionPolicy——當內存緩存達到最大,有新的element加入的時候, 移除緩存中element的策略。默認是LRU(最近最少使用),可選的有LFU(最不常使用)和FIFO(先進先出)
  • clearOnFlush——內存達到最大時是否清除

3、使用示例

public class Test1 {
    
    @Test
    public void test1() {
        // 1. 創建緩存管理器
        CacheManager cacheManager = CacheManager.create("./src/main/resources/ehcache.xml");
        
        // 2. 獲取緩存對象
        Cache cache = cacheManager.getCache("HelloWorldCache");
        
        // 3. 創建元素
        Element element = new Element("key1", "value1");
        
        // 4. 將元素添加到緩存
        cache.put(element);
        
        // 5. 獲取緩存
        Element value = cache.get("key1");
        System.out.println(value);
        System.out.println(value.getObjectValue());
        
        // 6. 刪除元素
        cache.remove("key1");
        
        Person p1 = new Person("小明",18,"杭州");
        Element pelement = new Element("xm", p1);
        cache.put(pelement);
        Element pelement2 = cache.get("xm");
        System.out.println(pelement2.getObjectValue());
        
        System.out.println(cache.getSize());
        
        // 7. 刷新緩存
        cache.flush();
        
        // 8. 關閉緩存管理器
        cacheManager.shutdown();

    }

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM