10
7

More than 5 years have passed since last update.

SpringCacheに使用可能なCache実装について

Last updated at Posted at 2019-02-10

SpringCache

Spring Framework3.1以降追加された機能。
Spring4.1からJSR-107のサポートやカスタマイズオプションが増えた。
「あるメソッドの指定した引数に対する戻り値」 をキャッシュの単位とする。

※指定した引数に対して、メソッドが既に実行されているかどうかをチェックする
→実行されていた場合、実際のメソッドを実行せずにキャッシュを返却する。
→実行されていない場合、そのメソッドを実行し、結果をキャッシュに格納する。

SpringCacheで用いることが可能なキャッシュ実装

  1. JDK(java.util.concurrent.ConcurrentMap)ベース
  2. Ehcache2.xベース
  3. Gemfireベース
  4. Caffeineベース
  5. JSR-107ベース
  6. Redisベース

※恐らく他にもある
※以下を実装することで拡張可能
- org.springframework.cache.CacheManager
- org.springframework.cache.Cache

各キャッシュ実装は使用する CacheManager を切り替えることによって切り替えが可能。

1. ConcurrentHashMapベース

spring-context-xxx.jar に格納。
使用する CacheManagerSimpleCacheManager
アプリケーションによって作成されるため、ライフサイクルに拘束される。基本的な使用・テスト・単純アプリに適する。拡張性は優れるが、管理や永続に関する機能は提供されない。

<!-- simple cache manager -->
<bean id="cacheManager" class="org.springframework.cache.support.SimpleCacheManager">
    <property name="caches">
        <set>
            <bean class="org.springframework.cache.concurrent.ConcurrentMapCacheFactoryBean" p:name="books"/>
        </set>
    </property>
</bean>

2. Ehcache2.xベース

spring-context-support-xxx.jar に格納。
使用する CacheManagerEhCacheCacheManager

<bean id="cacheManager"
        class="org.springframework.cache.ehcache.EhCacheCacheManager" p:cache-manager-ref="ehcache"/>

<!-- EhCache library setup -->
<bean id="ehcache"
        class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean" p:config-location="ehcache.xml"/>

Ehcacheとは

Javaにおけるキャッシュライブラリのデファクトスタンダード。 JSR-107(JCache) の実装ライブラリ。
基本はメモリ上に保存しつつ、ローカルディスクへの退避も可能になっている。
レプリケーションやトランザクション機能などを提供する。

使用可能なストレージは以下の通り。

  • Memory Store
    Javaのヒープメモリ。シリアライズ不可のオブジェクトについても保存可能。
  • off-Heap Store
    メモリ上に格納するが、GCの対象にはならない。デフォルトでの使用は出来ず、 Terracotta BigMemory を使用する必要がある。シリアライズ可能なオブジェクトのみ保存可能。
  • Disk Store
    ファイルなどのメモリ外ストレージ。シリアライズ可能なオブジェクトのみ保存可能。

参考

3. Caffeineベース

spring-context-support-xxx.jar に格納。
使用する CacheManagerCaffeineCacheManager
キャッシュはメモリに保持する。Guava+ConcurrentLinkedHashMapのような保持方法。
頻度や最新性に基づいて、最大格納量や最大格納時間を越えた場合にキャッシュリリースを行う機能を提供する。

<bean id="cacheManager"
        class="org.springframework.cache.caffeine.CaffeineCacheManager"/>

Caffeine Cacheとは

Google Guava Cache にインスパイアされてJava8で書き下ろしたキャッシュ機構。
ハイパフォーマンスを謳っている。(Ehcache > Google Guava > Caffeine)
Spring4.3から採用されており、それ以前からサポートされていたGuavaは5.0にて削除された。

参考

4. Gemfireベース

CacheManager はSpring FrameworkではなくSpring Dataにて提供している。

  <!-- enable declarative caching -->
  <cache:annotation-driven/>

  <gfe:cache id="gemfire-cache"/>

  <!-- declare GemfireCacheManager; must have a bean ID of 'cacheManager' -->
  <bean id="cacheManager" class="org.springframework.data.gemfire.cache.GemfireCacheManager"
      p:cache-ref="gemfire-cache">

GemFireとは

インメモリデータグリッドを利用しているため大量なデータへの対応に有利。
VMwareの1製品として作られている。
キーワード:メモリ志向・ディスクバックアップ・弾性スケーラブル・継続利用可能・グローバルレプリケート

参考

5. JSR-107ベース

spring-context-support-xxx.jar に格納。
使用する CacheManagerJCacheCacheManager

<bean id="cacheManager"
        class="org.springframework.cache.jcache.JCacheCacheManager"
        p:cache-manager-ref="jCacheManager"/>

<!-- JSR-107 cache manager setup  -->
<bean id="jCacheManager" .../>

6. Redisベース

CacheManager はSpring FrameworkではなくSpring Dataにて提供している。
使用する CacheManagerRedisCacheManager

Redisとは

キャッシュ格納先はインメモリDB
一定間隔でスナップショットを撮り、再起動時にメモリに展開してデータの永続性を図る。

参考

--

他参照したリファレンスなど

公式リファレンス

その他

10
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
7