spring-boot整合ehcache實現緩存機制

EhCache 是一個純Java的進程內緩存框架,具備快速、精幹等特色,是Hibernate中默認的CacheProvider。java

  ehcache提供了多種緩存策略,主要分爲內存和磁盤兩級,因此無需擔憂容量問題。mysql

  spring-boot是一個快速的集成框架,其設計目的是用來簡化新Spring應用的初始搭建以及開發過程。該框架使用了特定的方式來進行配置,從而使開發人員再也不須要定義樣板化的配置。web

  因爲spring-boot無需任何樣板化的配置文件,因此spring-boot集成一些其餘框架時會有略微的不一樣。spring

  1.spring-boot是一個經過maven管理的jar包的框架,集成ehcache須要的依賴以下sql

複製代碼

<dependency>
    <groupId>org.springframework</groupId>
     <artifactId>spring-context-support</artifactId>
</dependency>
<dependency>
         <groupId>net.sf.ehcache</groupId>
      <artifactId>ehcache</artifactId>
          <version>2.8.3</version>
</dependency>

複製代碼

    具體pom.xml文件以下apache

複製代碼

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.lclc.boot</groupId>
    <artifactId>boot-cache</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <!-- Inherit defaults from Spring Boot -->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.1.3.RELEASE</version>
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>17.0</version>
        </dependency>
        
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
        </dependency>
        <dependency>
            <groupId>net.sf.ehcache</groupId>
            <artifactId>ehcache</artifactId>
            <version>2.8.3</version>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

    <repositories>
        <repository>
            <id>spring-snapshots</id>
            <url>http://repo.spring.io/snapshot</url>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
        </repository>
        <repository>
            <id>spring-milestones</id>
            <url>http://repo.spring.io/milestone</url>
        </repository>
    </repositories>
    <pluginRepositories>
        <pluginRepository>
            <id>spring-snapshots</id>
            <url>http://repo.spring.io/snapshot</url>
        </pluginRepository>
        <pluginRepository>
            <id>spring-milestones</id>
            <url>http://repo.spring.io/milestone</url>
        </pluginRepository>
    </pluginRepositories>

</project>

複製代碼

   2.使用ehcache,咱們須要一個ehcache.xml來定義一些cache的屬性。緩存

按 Ctrl+C 複製代碼框架

 

按 Ctrl+C 複製代碼maven

   解釋下這個xml文件中的標籤。ide

  (1).diskStore: 爲緩存路徑,ehcache分爲內存和磁盤兩級,此屬性定義磁盤的緩存位置。參數解釋以下:    
             user.home – 用戶主目錄
             user.dir  – 用戶當前工做目錄
             java.io.tmpdir – 默認臨時文件路徑

  (2).defaultCache:默認緩存策略,當ehcache找不到定義的緩存時,則使用這個緩存策略。只能定義一個。

       (3).cache:自定緩存策略,爲自定義的緩存策略。參數解釋以下:

    cache元素的屬性:   
            name:緩存名稱                  
            maxElementsInMemory:內存中最大緩存對象數                  
            maxElementsOnDisk:硬盤中最大緩存對象數,如果0表示無窮大                  
            eternal:true表示對象永不過時,此時會忽略timeToIdleSeconds和timeToLiveSeconds屬性,默認爲false                
            overflowToDisk:true表示當內存緩存的對象數目達到了maxElementsInMemory界限後,會把溢出的對象寫到硬盤緩存中。注意:若是緩存的對象要寫入到硬盤中的話,則該對象必須實現了Serializable接口才行。                  
            diskSpoolBufferSizeMB:磁盤緩存區大小,默認爲30MB。每一個Cache都應該有本身的一個緩存區。               
            diskPersistent:是否緩存虛擬機重啓期數據                  
            diskExpiryThreadIntervalSeconds:磁盤失效線程運行時間間隔,默認爲120秒     
            timeToIdleSeconds: 設定容許對象處於空閒狀態的最長時間,以秒爲單位。當對象自從最近一次被訪問後,若是處於空閒狀態的時間超過了timeToIdleSeconds屬性值,這個對象就會過時,EHCache將把它從緩存中清空。只有當eternal屬性爲false,該屬性纔有效。若是該屬性值爲0,則表示對象能夠無限期地處於空閒狀態                  
            timeToLiveSeconds:設定對象容許存在於緩存中的最長時間,以秒爲單位。當對象自從被存放到緩存中後,若是處於緩存中的時間超過了 timeToLiveSeconds屬性值,這個對象就會過時,EHCache將把它從緩存中清除。只有當eternal屬性爲false,該屬性纔有效。若是該屬性值爲0,則表示對象能夠無限期地存在於緩存中。timeToLiveSeconds必須大於timeToIdleSeconds屬性,纔有意義     
            memoryStoreEvictionPolicy:當達到maxElementsInMemory限制時,Ehcache將會根據指定的策略去清理內存。可選策略有:LRU(最近最少使用,默認策略)、FIFO(先進先出)、LFU(最少訪問次數)。  

 

  3.將ehcache的管理器暴露給spring的上下文容器,

  

按 Ctrl+C 複製代碼

 

按 Ctrl+C 複製代碼

 

       @Configuration:爲spring-boot註解,主要標註此爲配置類,優先掃描。

      @Bean:向spring容器中加入bean。

  至此全部的配置都作好了,經過spring-boot進行集成框架就是這麼簡單。

  4.使用ehcache

    使用ehcache主要經過spring的緩存機制,上面咱們將spring的緩存機制使用了ehcache進行實現,因此使用方面就徹底使用spring緩存機制就好了。
    具體牽扯到幾個註解:

    @Cacheable:負責將方法的返回值加入到緩存中,參數3
    @CacheEvict:負責清除緩存,參數4

     參數解釋:

    value:緩存位置名稱,不能爲空,若是使用EHCache,就是ehcache.xml中聲明的cache的name
    key:緩存的key,默認爲空,既表示使用方法的參數類型及參數值做爲key,支持SpEL
    condition:觸發條件,只有知足條件的狀況纔會加入緩存,默認爲空,既表示所有都加入緩存,支持SpEL

    allEntries:CacheEvict參數,true表示清除value中的所有緩存,默認爲false

  很少說,直接上代碼:

  

複製代碼

@Service
public class CacheDemoServiceImpl implements CacheDemoService {

    /**
     * 緩存的key
     */
    public static final String THING_ALL_KEY   = "\"thing_all\"";
    /**
     * value屬性表示使用哪一個緩存策略,緩存策略在ehcache.xml
     */
    public static final String DEMO_CACHE_NAME = "demo";
   
    @CacheEvict(value = DEMO_CACHE_NAME,key = THING_ALL_KEY)
    @Override
    public void create(Thing thing){
        Long id = getNextId ();
        thing.setId (id);
        data.put (id, thing);
    } 
      
     @Cacheable(value = DEMO_CACHE_NAME,key = "#thing.getId()+'thing'")
    @Override
    public Thing findById(Long id){
        System.err.println ("沒有走緩存!" + id);
        return data.get (id);
    }

      @Cacheable(value = DEMO_CACHE_NAME,key = THING_ALL_KEY)
    @Override
    public List<Thing> findAll(){
        return Lists.newArrayList (data.values ());
    }
   
   
      @Override
    @CachePut(value = DEMO_CACHE_NAME,key = "#thing.getId()+'thing'")
    @CacheEvict(value = DEMO_CACHE_NAME,key = THING_ALL_KEY)
    public Thing update(Thing thing){
        System.out.println (thing);
        data.put (thing.getId (), thing);
        return thing;
    }

    @CacheEvict(value = DEMO_CACHE_NAME)
    @Override
    public void delete(Long id){
        data.remove (id);
    }
   
}

複製代碼

 

    5.只須要經過註解在service層方法上打註解即可以使用緩存,在find**上存入緩存,在delete**,update**上清除緩存。

相關文章
相關標籤/搜索