SpringCache
Spring Framework3.1以降追加された機能。
Spring4.1からJSR-107
のサポートやカスタマイズオプションが増えた。
「あるメソッドの指定した引数に対する戻り値」 をキャッシュの単位とする。
※指定した引数に対して、メソッドが既に実行されているかどうかをチェックする
→実行されていた場合、実際のメソッドを実行せずにキャッシュを返却する。
→実行されていない場合、そのメソッドを実行し、結果をキャッシュに格納する。
SpringCacheで用いることが可能なキャッシュ実装
- JDK(java.util.concurrent.ConcurrentMap)ベース
- Ehcache2.xベース
- Gemfireベース
- Caffeineベース
- JSR-107ベース
- Redisベース
※恐らく他にもある
※以下を実装することで拡張可能
各キャッシュ実装は使用する CacheManager
を切り替えることによって切り替えが可能。
1. ConcurrentHashMapベース
spring-context-xxx.jar
に格納。
使用する CacheManager
は SimpleCacheManager
。
アプリケーションによって作成されるため、ライフサイクルに拘束される。基本的な使用・テスト・単純アプリに適する。拡張性は優れるが、管理や永続に関する機能は提供されない。
<!-- 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
に格納。
使用する CacheManager
は EhCacheCacheManager
。
<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
ファイルなどのメモリ外ストレージ。シリアライズ可能なオブジェクトのみ保存可能。
参考
- Ehcache 使い方メモ
- [レプリケーションとは | バックアップとアーカイブ | サービス3選](https://boxil.jp/mag/a2534/#2534-1
- JCache(Ehcache 3)のメソッドの結果キャッシュを軽く試してみた feat. Guice
3. Caffeineベース
spring-context-support-xxx.jar
に格納。
使用する CacheManager
は CaffeineCacheManager
。
キャッシュはメモリに保持する。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
に格納。
使用する CacheManager
は JCacheCacheManager
。
<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にて提供している。
使用する CacheManager
は RedisCacheManager
。
Redisとは
キャッシュ格納先はインメモリDB。
一定間隔でスナップショットを撮り、再起動時にメモリに展開してデータの永続性を図る。
参考
- Spring Data Redis におけるデフォルト設定の注意点
- Spring BootでSpring Data Redisを利用する
- Redis入門: Redisとは? インメモリDBについて、memcachedとの違いなど
- Spring BootでRedisにキャッシュする際の抽象化について
- Redisのインストール・セットアップ
--
他参照したリファレンスなど
公式リファレンス
その他