ehcache

簡述

EhCache 是一個純Java的分佈式的進程內緩存框架,具有快速、精幹等特點,主要面向通用緩存,Java EE和輕量級容器。它具有內存和磁盤存儲,緩存加載器,緩存擴展,緩存異常處理程序,一個gzip緩存servlet過濾器,支持REST和SOAP api等特點,是Hibernate中默認的CacheProvider;

  • 在 Spring Boot中,通過@EnableCaching註解自動化配置合適的緩存管理器

  • 關於 Spring Boot 的緩存機制:
    高速緩存抽象不提供實際存儲,並且依賴於由org.springframework.cache.Cache和org.springframework.cache.CacheManager接口實現的抽象。 Spring Boot根據實現自動配置合適的CacheManager,只要緩存支持通過@EnableCaching註釋啓用即可。

  • 特點
    (1)快速簡單,具有多種緩存策略
    (2)緩存數據有兩級爲內存和磁盤,緩存數據會在虛擬機重啓的過程中寫入磁盤
    (3)可以通過RMI、可插入API等方式進行分佈式緩存
    (4)具有緩存和緩存管理器的偵聽接口
    (5)支持多緩存管理器實例,以及一個實例的多個緩存區域。並提供Hibernate的緩存實現
    (6)Ehcache有緩存共享方案,不過是通過RMI或者Jgroup多播方式進行廣播緩存通知更新,緩存共享複雜,維護不方便;簡單的共享可以,但是涉及到緩存恢復,大數據緩存,則不合適

環境搭建

  • 依賴
      <!--開啓 cache 緩存-->
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-cache</artifactId>
      </dependency>
      <!-- ehcache 緩存 -->
      <dependency>
          <groupId>net.sf.ehcache</groupId>
          <artifactId>ehcache</artifactId>
      </dependency>
  • 配置文件(eccache.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">
   //默認緩存策略,當ehcache找不到定義的緩存時,則使用這個緩存策略。只能定義一個。
    <defaultCache
           //對象是否永久有效,一但設置了,timeout將不起作用。
            eternal="false"
            //內存緩存最大數目
            maxElementsInMemory="1000"
            //硬盤最大緩存個數
            maxElementsOnDisk="5000"
            //是否保存到磁盤,當系統宕機時
            overflowToDisk="false"
            //是否緩存虛擬機重啓期數據
            diskPersistent="false"
            //設置對象在失效前的允許閒置時間(單位:秒)。僅當eternal=false對象不是永久有效時使用,可選屬性,默認值是0,也就是可閒置時間無窮大。
            timeToIdleSeconds="0"
            //設置對象在失效前允許存活時間(單位:秒)。最大時間介於創建時間和失效時間之間。僅當eternal=false對象不是永久有效時使用,默認是0.,也就是對象存活時間無窮大。
            timeToLiveSeconds="600"
            //當達到緩存最大值限制時,緩存清除策略
            memoryStoreEvictionPolicy="LRU" />

    <!-- 這裏以example爲例 -->
    <cache
            //緩存名稱
            name="example"
            eternal="false"
            maxElementsInMemory="100"
            overflowToDisk="false"
            diskPersistent="false"
            timeToIdleSeconds="0"
            timeToLiveSeconds="300"     
            memoryStoreEvictionPolicy="LRU" />
</ehcache>

diskStore:爲緩存路徑,ehcache分爲內存和磁盤兩級,此屬性定義磁盤的緩存位置。
diskSpoolBufferSizeMB:這個參數設置DiskStore(磁盤緩存)的緩存區大小。默認是30MB。每個Cache都應該有自己的一個緩衝區。
diskExpiryThreadIntervalSeconds:磁盤失效線程運行時間間隔,默認是120秒。
clearOnFlush:內存數量最大時是否清除。
memoryStoreEvictionPolicy:可選策略有:LRU(最近最少使用,默認策略)、FIFO(先進先出)、LFU(最少訪問次數)。 

項目使用

  • springboot支持的註解
    1:@Cacheable : Spring在每次執行前都會檢查Cache中是否存在相同key的緩存元素,如果存在就不再執行該方法,而是直接從緩存中獲取結果進行返回,否則纔會執行並將返回結果存入指定的緩存中。
    2:@CacheEvict : 清除緩存。
    3: @CachePut : @CachePut也可以聲明一個方法支持緩存功能。使用@CachePut標註的方法在執行前不會去檢查緩存中是否存在之前執行過的結果,而是每次都會執行該方法,並將執行結果以鍵值對的形式存入指定的緩存中。
  • 這三個方法中都有兩個主要的屬性:value 指的是 ehcache.xml 中的緩存策略空間(name屬性);key 指的是緩存的標識,同時可以用 # 來引用參數。

與其他緩存比較

  • ehcache和redis有什麼區別
    前者操作簡單易使用,存取速度快,效率更高但是不適合大型的分佈式集羣部署。而後者更適合用於大數據緩存,數據恢復等。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章