詳しくはspringbootを解決してehcacheを統合してキャッシュメカニズムを実現します。


EhCacheは純粋なJavaのプロセス内キャッシュフレームであり、高速、精干などの特徴があり、HbernateでデフォルトのCachProviderである。
ehcacheは様々なキャッシュポリシーを提供しています。主にメモリとディスクの二段階に分けられていますので、容量の問題を心配する必要はありません。
spring-bootは新しいSpringアプリケーションの初期構築及び開発プロセスを簡素化するための高速集積フレームである。このフレームワークは、特定の方法を使用して配置され、開発者がモデル化された配置を定義する必要がなくなります。
spring-bootはいかなるサンプル化の配置ファイルが必要ないので、spring-bootは他のフレームをまとめる時には少し違っています。
1.spring-bootは、mavenによって管理されているjarカバンの枠組みであり、ehcacheの統合に必要な依存は以下の通りである。

 <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ファイルは以下の通りです。

<?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の属性を定義する必要があります。

<?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">
     <diskStore path="java.io.tmpdir/Tmp_EhCache" />
      <defaultCache eternal="false" maxElementsInMemory="1000" overflowToDisk="false" diskPersistent="false"
  timeToIdleSeconds="0" timeToLiveSeconds="600" memoryStoreEvictionPolicy="LRU" />

      <cache name="demo" eternal="false" maxElementsInMemory="100" overflowToDisk="false" diskPersistent="false"
  timeToIdleSeconds="0" timeToLiveSeconds="300" memoryStoreEvictionPolicy="LRU" />

</ehcache>
このxmlファイルのラベルを説明します。
(1).disk Store:キャッシュパスで、ehcacheはメモリとディスクの2段階に分けられます。この属性はディスクのキャッシュ位置を定義します。パラメータの説明は以下の通りです。
  • user.home Cユーザーディレクトリ
  • user.dir  Cユーザの現在の作業ディレクトリ
  • java.io.tmpdir Cデフォルト一時ファイルパス
  • (2).defaultCache:デフォルトキャッシュポリシーは、ehcacheが定義されたキャッシュを見つけられない場合、このキャッシュポリシーを使用する。一つだけ定義できます。
     (3)cache:キャッシュポリシーをカスタマイズし、ユーザー定義のキャッシュポリシーを設定します。パラメータの説明は以下の通りです。
  • cache要素の属性:   
  • name:キャッシュ名                  
  • maxElements InMemory:メモリ中最大キャッシュ対象数                  
  • maxElements OnDisk:ハードディスクにおける最大キャッシュ対象数は、0であれば無限大を表します。                  
  • eternal:trueはオブジェクトがいつまでも期限が切れることがないと表しています。この時はtimeToIdleSecondsとtimeToLiveSecondsの属性を無視します。デフォルトはfalseです。                
  • overflowToDisk:trueは、メモリキャッシュの対象数がmaxElements InMemory限界に達したとき、オーバーフローの対象をハードディスクキャッシュに書き込むと表しています。注意:キャッシュの対象がハードディスクに書き込まれる場合、そのオブジェクトはSerializableインターフェースを実現しなければなりません。                  
  • disk SpoolBufferSizMB:ディスクキャッシュエリアのサイズは、デフォルトでは30 MBです。各Cacheは自分のキャッシュエリアを持つべきです。               
  • diskyPersistent:仮想マシン再起動期間データをキャッシュするかどうか                  
  • diskyExpiry ThreadIntervalSeconds:ディスクが無効になるスレッドの運行時間間隔は、デフォルトでは120秒です。     
  • timeToIdleSeconds:許容対象がアイドル状態にある最長時間を設定し、秒単位で。このオブジェクトが最近訪問されてから、アイドル状態にある時間がtimeToIdleSecondsの属性値を超えたら、このオブジェクトは期限が切れます。EHCacheはキャッシュから空にします。この属性は、ETernal属性がfalseである場合にのみ有効です。この属性値が0の場合、オブジェクトは無期限でアイドル状態となります。                  
  • timeToLiveSeconds:設定オブジェクトは、キャッシュに存在する最長時間を秒単位で許可する。オブジェクトがキャッシュに保存されてから、キャッシュ中の時間がtimeToLiveSecondsの属性値を超えたら、このオブジェクトは期限が切れます。EHCacheはキャッシュから削除します。この属性は、ETernal属性がfalseである場合にのみ有効です。この属性値が0の場合、オブジェクトは無期限にキャッシュに存在することができる。timeToLiveSecondsはtimeToIdleSecondsの属性より大きくなければなりません。意味があります。     
  • memory StreevicationPolicy:maxElements InMemory制限に達すると、Ehcacheは指定されたポリシーに従ってメモリを整理します。オプションとしては、LRU(最近は最小使用、デフォルトポリシー)、FIFO(先入先出)、LFU(最小アクセス数)があります。  
  • SpringBootは多くのキャッシュ方式をサポートしています。redis、gava、ehcahe、jcacheなどです。
     redisとehcacheの違いを説明します。
    Redis:独立した実行プログラムに属しています。単独でインストールしてJava中のJedisを使って操作します。独立しているので、ユニットテストプログラムを書いて、データをRedisに入れて、プログラムを書いてデータを取りに行くと、このデータが得られます。
    ehcache:Redisとは明らかに違います。javaプログラムとは繋がっています。javaプログラムは生きています。例えば、独立プログラムを書いてデータを流し、もう一つの独立プログラムを書いてデータを取ると、データが得られません。独立したプログラムでしかデータを入手できません。
    3.ehcacheのマネージャをspringの文脈容器に暴露し、
    
    @Configuration
    //        
    @EnableCaching
    public class CacheConfiguration {
    
      /*
       * ehcache       
       */
      @Bean(name = "appEhCacheCacheManager")
      public EhCacheCacheManager ehCacheCacheManager(EhCacheManagerFactoryBean bean){
        return new EhCacheCacheManager (bean.getObject ());
      }
    
      /*
       *  shared     ,Spring    CacheManager.create() new CacheManager()       ehcache  .
       */
      @Bean
      public EhCacheManagerFactoryBean ehCacheManagerFactoryBean(){
        EhCacheManagerFactoryBean cacheManagerFactoryBean = new EhCacheManagerFactoryBean ();
        cacheManagerFactoryBean.setConfigLocation (new ClassPathResource ("conf/ehcache-app.xml"));
        cacheManagerFactoryBean.setShared (true);
        return cacheManagerFactoryBean;
      }
    }
    
    
    @Configration:spring-bootの注釈で、主にこれを配置類として表示し、優先的にスキャンします。
    @Bean:spring容器にbeanを入れます。
    これまでの配置は全部できました。spring-bootを通して統合するのは簡単です。
    4.ehcacheを使う
    ehcacheを使って、主にspringのキャッシュメカニズムを通して、上で私達はspringのキャッシュメカニズムをehcacheを使って実現しますので、使う側はspringキャッシュメカニズムを完全に使えばいいです。
    具体的にいくつかの注釈に関連する:
    @Cachebale:方法の戻り値をキャッシュに追加する責任があります。パラメータ3
    @Cacheevict:キャッシュ、パラメータのクリアを担当します。
    パラメータの説明:
  • value:キャッシュ位置名は、空ではなく、EHCacheを使えば、ehcache.xmlで宣言されたcacheのname
  • です。
  • key:キャッシュされたkeyは、デフォルトは空であり、使用方法のパラメータタイプ及びパラメータ値をkeyとして表し、SpEL
  • をサポートする。
  • condition:トリガ条件は、条件を満たす場合のみキャッシュに参加し、デフォルトは空で、すべてキャッシュに参加することを表し、SpEL
  • をサポートする。
  • all Enties: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**、udate*にキャッシュをクリアします。
    Cache注解詳細
    @CachConfig:主にこのクラスで使用されるいくつかの共通のキャッシュ構成を設定するために使用されます。ここで@CacheConfig(cacheNames=「users」):このデータの訪問先に戻ってきた内容をusersというキャッシュオブジェクトに格納します。この注釈を使わずに@Cacheable自身でキャッシュセットの名前を直接定義してもいいです。
    @Cachebale:findByName関数を構成した戻り値がキャッシュに追加されます。同時に照会する場合は、まずキャッシュから取得し、存在しない場合はデータベースへのアクセスを開始します。この注釈は主に以下のいくつかのパラメータがあります。
  • value、cacheNames:2つの均等なパラメータ(cacheNamesはSpring 4に追加され、valueの別名として)は、キャッシュメモリのセット名を指定するために使用されます。Spring 4に@CachConfigが追加されたので、Spring 3に本来必要なvalue属性も非必須アイテムとなりました。
  • key:Mapセットに記憶されているキャッシュオブジェクトのkey値は、必須ではなく、デフォルトは関数のすべてのパラメータの組み合わせに基づいてkey値として、自分で設定するならばSpEL式を使用します。例えば、@Cachebale(key="炜p 0"):関数の最初のパラメータをキャッシュのkey値として使用して、SpEL式の詳細は
  • を参照してください。
  • condition:キャッシュオブジェクトの条件は、必須ではなく、SpEL表現を使用して、表現条件を満たす内容だけがキャッシュされます。例えば、@Cachebale(key=「潈p 0」、condition=「炜p 0.length()<3」)は、最初のパラメータの長さが3未満の場合のみキャッシュされます。読者は自分で実験してみることができる。
  • unless:もう一つのキャッシュ条件パラメータは必須ではなく、SpEL式を使用する必要があります。conditionパラメータとは違って、関数が呼び出されてから判断される場合がありますので、resultについて判断することができます。
  • keyGenerator:keyジェネレータを指定するためには、必須ではない。カスタムkeyジェネレータを指定する必要があれば、org.springframewark.ache.interceptort.KeyGeneratorインターフェースを実現し、このパラメータを使用して指定します。注意したいのは、このパラメータとkeyは互いに反発する
  • である。
  • cacheManager:どのキャッシュマネージャを使用するかを指定するためには、必要ではありません。複数があるときだけ
  • を使用する必要があります。
  • cacheResolaver:そのキャッシュ解像器を指定するためには、必要ではありません。org.springframe ework.cache.interceptor.acheResolaverインターフェースを通じて自分のキャッシュ解像度を実現し、このパラメータで指定します。
  • ここで使われている二つの注釈のほかに、以下のいくつかの核心的な注釈があります。
    @CachePut:関数上に配置されています。パラメータ定義条件によってキャッシュができます。@Cachebaleとは違い、毎回本当に関数を呼び出すので、データの新規作成と修正操作に主に使用されます。そのパラメータは@Cachebaleと似ています。具体的な機能は上の@Cachebaleパラメータの解析を参照してください。
    @Cacheevict:関数的に構成されており、通常は削除方法でキャッシュから該当データを除去するために使用されます。@Cachebaleと同じパラメータ以外に、次の二つのパラメータがあります。
  •  all Enties:必須ではなく、デフォルトはfalseです。trueの場合、すべてのデータは削除されます。
  • before Invocation:必須ではなく、デフォルトはfalseで、メソッドを呼び出した後にデータを除去します。trueの場合は、メソッドを呼び出す前にデータを削除します。
  • 以上が本文の全部です。皆さんの勉強に役に立つように、私たちを応援してください。