SpringBootシリーズ(7)---SpringBoot-Cache(EhCache)
13866 ワード
SpringBootはデータキャッシュの機能を提供しており、多くの人がcacheを使ったことがあると信じています.データベースのIOボトルネックは皆さんも損をしたはずなので、redisの導入、hibernateの2次キャッシュの導入など、多くのキャッシュポリシーを導入します.
SpringBootはannotationの面でcacheを実現してくれました.もちろんSpringのAOPのおかげです.すべてのキャッシュ構成はannotationレベルで構成されているだけで、宣言トランザクションのようにコードに侵入していません.
Springでは、CacheManagerとCacheインタフェースが異なるキャッシュ技術を統合することを定義します.ここでCacheManagerはSpringが提供する各種キャッシュ技術の抽象インタフェースである.Cacheインタフェースにはキャッシュの様々な操作が含まれています.もちろん、Cacheインタフェースを直接操作することはありません.
Springは異なるキャッシュ技術に対して異なるcacheManagerを実現する必要があり、Springは以下のcacheManger実現を定義している.
CacheManger
説明
SimpleCacheManager
簡単なCollectionを使用してキャッシュを格納し、主にテストに使用します.
ConcurrentMapCacheManager
キャッシュ・テクノロジーとしてConcurrentMapを使用する(デフォルト)
NoOpCacheManager
テスト用
EhCacheCacheManager
キャッシュ技術としてEhCacheを使用しており、以前はhibernateでよく使われていました
GuavaCacheManager
Google guavaのGuavaCacheをキャッシュ技術として使用
HazelcastCacheManager
キャッシュ・テクノロジーとしてHazelcastを使用
JCacheCacheManager
Apache Commons JCSなどのキャッシュ技術としてJCache標準の実装を用いる
RedisCacheManager
Redisをキャッシュ・テクノロジーとして使用
もちろん、通常のSpringBootでは、EhCache、Collection、Guava、ConcurrentMapなどのキャッシュが自動的に構成されており、デフォルトではSimpleCacheConfiguration、すなわちConcurrentMapCacheManagerが使用されます.SpringBootのアプリケーションpropertiesプロファイル、springを使用します.Cache接頭辞のプロパティを構成します.
SpringBoot環境では、関連するキャッシュ・テクノロジーの依存をインポートし、構成クラスで@EnableCachingオープン・キャッシュ・テクノロジーを構成する必要があります.
ここではデフォルトのConcurrentMapCacheではなくEhCacheを使用します
だから私はresourcesディレクトリの下でehcacheを作成しました.xmlのプロファイルをアプリケーションで作成します.properties設定typeはehcache(intellijに明確なヒントがあります):
ehcache.xml:
SpringBootはannotationの面でcacheを実現してくれました.もちろんSpringのAOPのおかげです.すべてのキャッシュ構成はannotationレベルで構成されているだけで、宣言トランザクションのようにコードに侵入していません.
Springでは、CacheManagerとCacheインタフェースが異なるキャッシュ技術を統合することを定義します.ここでCacheManagerはSpringが提供する各種キャッシュ技術の抽象インタフェースである.Cacheインタフェースにはキャッシュの様々な操作が含まれています.もちろん、Cacheインタフェースを直接操作することはありません.
Springは異なるキャッシュ技術に対して異なるcacheManagerを実現する必要があり、Springは以下のcacheManger実現を定義している.
CacheManger
説明
SimpleCacheManager
簡単なCollectionを使用してキャッシュを格納し、主にテストに使用します.
ConcurrentMapCacheManager
キャッシュ・テクノロジーとしてConcurrentMapを使用する(デフォルト)
NoOpCacheManager
テスト用
EhCacheCacheManager
キャッシュ技術としてEhCacheを使用しており、以前はhibernateでよく使われていました
GuavaCacheManager
Google guavaのGuavaCacheをキャッシュ技術として使用
HazelcastCacheManager
キャッシュ・テクノロジーとしてHazelcastを使用
JCacheCacheManager
Apache Commons JCSなどのキャッシュ技術としてJCache標準の実装を用いる
RedisCacheManager
Redisをキャッシュ・テクノロジーとして使用
もちろん、通常のSpringBootでは、EhCache、Collection、Guava、ConcurrentMapなどのキャッシュが自動的に構成されており、デフォルトではSimpleCacheConfiguration、すなわちConcurrentMapCacheManagerが使用されます.SpringBootのアプリケーションpropertiesプロファイル、springを使用します.Cache接頭辞のプロパティを構成します.
spring.cache.type=#
spring.cache.cache-names=
spring.cache.ehcache.config=ehcache
spring.cache.infinispan.config=infinispan
spring.cache.jcache.config=jcache
spring.cache.jcache.provider= jcache , jcache
SpringBoot環境では、関連するキャッシュ・テクノロジーの依存をインポートし、構成クラスで@EnableCachingオープン・キャッシュ・テクノロジーを構成する必要があります.
ここではデフォルトのConcurrentMapCacheではなくEhCacheを使用します
だから私はresourcesディレクトリの下でehcacheを作成しました.xmlのプロファイルをアプリケーションで作成します.properties設定typeはehcache(intellijに明確なヒントがあります):
ehcache.xml:
path="java.io.tmpdir"/> name="weibo" maxElementsInMemory="10000" /> maxElementsInMemory="10000" eternal="false" overflowToDisk="true" timeToIdleSeconds="10" timeToLiveSeconds="120" diskPersistent="false" memoryStoreEvictionPolicy="LRU" diskExpiryThreadIntervalSeconds="120"/>
application.properties:コンフィギュレーションクラスで@EnableCachingspring.cache.type=ehcache spring.cache.ehcache.config=ehcache.xml
@SpringBootApplication @EnableCaching public class DemoApplication extends WebMvcConfigurerAdapter {
次に、4つのannotationの構成について説明します.
@Cacheableメソッドが実行される前にSpringにキャッシュデータがあるかどうか、直接返される場合.データがない場合は、メソッドを呼び出し、メソッドの戻り値をキャッシュに格納します.
@CachePutはいずれにしても,メソッドの範湖値をキャッシュに入れる.
@CacheEveictは、1つまたは複数のデータをキャッシュから削除します.
@Cachingは、@Caching注釈によって複数の注釈セットを1つの方法で組み合わせることができる
デモンストレーションJPAの方法を使用してキャッシュテストを行います.@Transactional @CachePut(value = "weibo",key="#weibo.weiboId") public Weibo saveWeibo(Weibo weibo){ this.weiboRepository.save(weibo); return weibo; } @Cacheable(value = "weibo") public Weibo getWeiboById(long id){ return this.weiboRepository.getByWeiboId(id); } @Transactional @CacheEvict(value = "weibo",key = "#weibo.weiboId") public void remove(Weibo weibo){ this.weiboRepository.delete(weibo); }
もちろんweiboというキャッシュを単独で構成したいならehcacheを通じてもいいです.xmlは個別に構成されますが、maxElementsInMemoryプロパティ構成が必要であることを注意してください.そうしないとSpringBootアプリケーションを起動できません.
name="weibo" maxElementsInMemory="10000" overflowToDisk="false" timeToIdleSeconds="60" timeToLiveSeconds="120" />
Controllerによるテストでは、キャッシュが有効になります.@RestController @RequestMapping("/cache") public class CacheTestController { @Autowired private WeiboService weiboService; @Autowired private UserRepository userRepository; @RequestMapping("/getWeibo/{id}") public Weibo getWeibo(@PathVariable("id") long id){ return weiboService.getWeiboById(id); } @RequestMapping("/addWeibo") public Weibo addWeibo(String username,String weiboText){ User user = userRepository.getByUsernameIs(username); Weibo weibo = new Weibo(user,weiboText,new Date(System.currentTimeMillis())); return this.weiboService.saveWeibo(weibo); } @RequestMapping("/delete/{id}") public Weibo delete(@PathVariable("id") long id){ Weibo weibo = this.weiboService.getWeiboById(id); this.weiboService.remove(weibo); return weibo; } }