キャッシュマネージャ
10789 ワード
キャッシュマネージャ
Spring 3.1には、次のように5つのキャッシュマネージャが内蔵されています.-SimpleCacheManager-NoOpCacheManager-ConcurrentMapCacheManager-CompositeCacheManager-EhCacheCacheManager
Spring 3.2には、JCache(JSR-107)ベースのキャッシュプロバイダで使用できる別のキャッシュマネージャが導入されている.Spring Dataには、コアのSpringフレームワークに加えて、2つのキャッシュマネージャがあります. RedisCacheManager(Spring Data Redisプロジェクトから) GemfireCacheManager(Spring Data GemFireプロジェクトから) Springのキャッシュ抽象に対してキャッシュマネージャを選択する場合は、オプションがたくさんあります.どちらを選択するかは、使用する最下位キャッシュ・ベンダーによって異なります.各シナリオでは、アプリケーションに異なるスタイルのキャッシュを提供できます.
Ehcacheキャッシュの使用
Ehcacheは最もポピュラーなキャッシュベンダーの1つです.Ehcacheのウェブサイトでは「Java分野で最も広く応用されているキャッシュ」と呼ばれています.SpringがEhcacheを統合したキャッシュマネージャを提供することは、その広範な採用に鑑みて有意義です.このキャッシュマネージャはEhCacheCacheManagerです.
CacheManager()メソッドは、Ehcache CacheManagerインスタンスに転送することによって実現されるEhCacheCacheManagerのインスタンスを作成する.
これはSpringとEhCacheがCacheManagerタイプを定義しているためです.EhCacheのCacheManagerがSpringのEhCacheCacheManager(Spring CacheManagerの実装)に注入されることを明確にする必要があります.
EhCacheのCacheManagerを使用して注入する必要があるので、CacheManager beanも宣言する必要があります.これを簡略化するため、SpringはEhCacheManager-FactoryBeanを提供し、EhCacheのCacheManagerを生成します.メソッドehcache()は、EhCacheManagerFactoryBeanインスタンスを作成して返します.SpringのFactoryBeanインタフェースを実装したファクトリbeanであるため、Springアプリケーションコンテキストに登録されているのはEhCacheManagerFactoryBeanのインスタンスではなくCacheManagerのインスタンスであるため、EhCacheCacheManagerに注入するのに適している.
Redisキャッシュの使用
カスタムキャッシュマネージャ
CacheResolver
その名前は、実際の状況に応じてどのCacheを使用するかを動的に解析するCache解析器であることを示しています.
contextには、現在のcacheの操作タイプ、ターゲットオブジェクト、ターゲットメソッド、パラメータ情報が格納されており、これらの情報に基づいてcacheの使用を決定することができます.context.getOperation().getCacheName()は、現在のターゲットオブジェクト/ターゲットメソッドで構成されているcache Nameを取得します.それに基づいて追加のcacheを追加することができます.
ここで注意したいのは、CacheResolverが構成されている場合でも、@CacheConfigまたは@CachePutのようなメソッドで少なくとも1つのCache Nameを指定する必要があります.
CacheErrorHandler
CacheからCRUDを実行したときの異常をキャプチャするコールバックプロセッサ.
複数のキャッシュマネージャの使用
キャッシュマネージャが1つしかないわけではありません.どのキャッシュ・マネージャを使用するべきか、または1つ以上のキャッシュ・マネージャを使用する合法的な技術的理由があるかを判断するのが難しい場合は、SpringのCompositeCacheManagerを使用してみてください.CompositeCacheManagerは、1つ以上のキャッシュマネージャで構成する必要があります.これらのキャッシュマネージャは、以前にキャッシュされた値を検索するために反復されます.次のリストでは、JCacheCacheManager、EhCacheCache-Manager、RedisCacheManagerを反復するCompositeCacheManager beanの作成方法を示します.
キャッシュエントリを検索すると、CompositeCacheManagerはまずCacheManager 1からCacheManager 1インプリメンテーションのチェックを開始し、CacheManager 2でCacheManager 2をチェックし、最後にCacheManager 3を使用してCacheManager 3をチェックし、キャッシュエントリの検索を完了します.キャッシュマネージャを構成してキャッシュを有効にすると、beanメソッドにキャッシュルールを適用できます.Springのキャッシュ注記を使用してキャッシュ境界を定義する方法を見てみましょう.
Spring 3.1には、次のように5つのキャッシュマネージャが内蔵されています.-SimpleCacheManager-NoOpCacheManager-ConcurrentMapCacheManager-CompositeCacheManager-EhCacheCacheManager
Spring 3.2には、JCache(JSR-107)ベースのキャッシュプロバイダで使用できる別のキャッシュマネージャが導入されている.Spring Dataには、コアのSpringフレームワークに加えて、2つのキャッシュマネージャがあります.
Ehcacheキャッシュの使用
Ehcacheは最もポピュラーなキャッシュベンダーの1つです.Ehcacheのウェブサイトでは「Java分野で最も広く応用されているキャッシュ」と呼ばれています.SpringがEhcacheを統合したキャッシュマネージャを提供することは、その広範な採用に鑑みて有意義です.このキャッシュマネージャはEhCacheCacheManagerです.
package com.lf.config;
import net.sf.ehcache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.ehcache.EhCacheCacheManager;
import org.springframework.cache.ehcache.EhCacheManagerFactoryBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;
/**
* Created by LF on 2017/5/9.
*/
@Configuration
@EnableCaching
public class MyEhCacheManage {
@Bean
public EhCacheCacheManager getCaCheManage(CacheManager cm) {
return new EhCacheCacheManager(cm);
}
@Bean
public EhCacheManagerFactoryBean regist() {
EhCacheManagerFactoryBean ehCacheManagerFactoryBean = new EhCacheManagerFactoryBean();
ehCacheManagerFactoryBean.setConfigLocation(new ClassPathResource(" "));
return ehCacheManagerFactoryBean;
}
}
CacheManager()メソッドは、Ehcache CacheManagerインスタンスに転送することによって実現されるEhCacheCacheManagerのインスタンスを作成する.
これはSpringとEhCacheがCacheManagerタイプを定義しているためです.EhCacheのCacheManagerがSpringのEhCacheCacheManager(Spring CacheManagerの実装)に注入されることを明確にする必要があります.
EhCacheのCacheManagerを使用して注入する必要があるので、CacheManager beanも宣言する必要があります.これを簡略化するため、SpringはEhCacheManager-FactoryBeanを提供し、EhCacheのCacheManagerを生成します.メソッドehcache()は、EhCacheManagerFactoryBeanインスタンスを作成して返します.SpringのFactoryBeanインタフェースを実装したファクトリbeanであるため、Springアプリケーションコンテキストに登録されているのはEhCacheManagerFactoryBeanのインスタンスではなくCacheManagerのインスタンスであるため、EhCacheCacheManagerに注入するのに適している.
Redisキャッシュの使用
package com.lf.config;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
/**
* Created by LF on 2017/5/9.
*/
@Configuration
@EnableCaching
public class MyRedisCacheManage {
@Bean
public CacheManager getCaCheManage(RedisTemplate redisTemplate) {
return new RedisCacheManager(redisTemplate);
}
@Bean
public RedisConnectionFactory getRedisConnectionFactory(){
JedisConnectionFactory factory = new JedisConnectionFactory();
return factory;
}
@Bean
public RedisTemplate getRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate template = new RedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
}
カスタムキャッシュマネージャ
package com.lf.config;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurer;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.interceptor.*;
import org.springframework.cache.support.SimpleCacheManager;
import org.springframework.context.annotation.Configuration;
/**
* Created by LF on 2017/5/8.
*/
@Configuration
@EnableCaching
public class Config implements CachingConfigurer {
@Override
public CacheManager cacheManager() {
return new SimpleCacheManager();
}
@Override
public CacheResolver cacheResolver() {
return new SimpleCacheResolver();
}
@Override
public KeyGenerator keyGenerator() {
return new SimpleKeyGenerator();
}
@Override
public CacheErrorHandler errorHandler() {
return new SimpleCacheErrorHandler();
}
}
CacheResolver
その名前は、実際の状況に応じてどのCacheを使用するかを動的に解析するCache解析器であることを示しています.
public class MyCacheResolver implements CacheResolver {
@Autowired
private CacheManager cacheManager;
@Override
public Collection extends Cache> resolveCaches(CacheOperationInvocationContext> context) {
List caches = new ArrayList();
for(String cacheName : context.getOperation().getCacheNames()) {
caches.add(cacheManager.getCache(cacheName));
}
if(context.getTarget() instanceof UserService2) {
caches.add(cacheManager.getCache("user2"));
caches.add(cacheManager.getCache("user3"));
}
return caches;
}
}
contextには、現在のcacheの操作タイプ、ターゲットオブジェクト、ターゲットメソッド、パラメータ情報が格納されており、これらの情報に基づいてcacheの使用を決定することができます.context.getOperation().getCacheName()は、現在のターゲットオブジェクト/ターゲットメソッドで構成されているcache Nameを取得します.それに基づいて追加のcacheを追加することができます.
ここで注意したいのは、CacheResolverが構成されている場合でも、@CacheConfigまたは@CachePutのようなメソッドで少なくとも1つのCache Nameを指定する必要があります.
CacheErrorHandler
CacheからCRUDを実行したときの異常をキャプチャするコールバックプロセッサ.
複数のキャッシュマネージャの使用
キャッシュマネージャが1つしかないわけではありません.どのキャッシュ・マネージャを使用するべきか、または1つ以上のキャッシュ・マネージャを使用する合法的な技術的理由があるかを判断するのが難しい場合は、SpringのCompositeCacheManagerを使用してみてください.CompositeCacheManagerは、1つ以上のキャッシュマネージャで構成する必要があります.これらのキャッシュマネージャは、以前にキャッシュされた値を検索するために反復されます.次のリストでは、JCacheCacheManager、EhCacheCache-Manager、RedisCacheManagerを反復するCompositeCacheManager beanの作成方法を示します.
@Bean
public CacheManager getCaCheManage(RedisTemplate redisTemplate) {
CompositeCacheManager cacheManager = new CompositeCacheManager();
List list =new ArrayList<>();
list.add(CacheManager1)
list.add(CacheManager2)
list.add(CacheManager3)
cacheManager.setCacheManagers(list);
return cacheManager;
}
キャッシュエントリを検索すると、CompositeCacheManagerはまずCacheManager 1からCacheManager 1インプリメンテーションのチェックを開始し、CacheManager 2でCacheManager 2をチェックし、最後にCacheManager 3を使用してCacheManager 3をチェックし、キャッシュエントリの検索を完了します.キャッシュマネージャを構成してキャッシュを有効にすると、beanメソッドにキャッシュルールを適用できます.Springのキャッシュ注記を使用してキャッシュ境界を定義する方法を見てみましょう.