分散キャッシュ(例:Hazelcast
)とローカルキャッシュ(例:Guava
)の両方を使用する必要があるSpring Boot
アプリに取り組んでいます。 @Cacheable
を使用するときに両方を使用するようにSpringCacheを構成し、キャッシュ名に基づいて必要な実装を決定する方法はありますか?
内部のキャッシュ名を定義するHZとGuavaの両方の構成を作成しようとしましたが、Springは、HZによって処理されるはずのキャッシュ名が見つからないと文句を言います。 HZまたはGuavaのみを使用すると、機能します。
キャッシュ名に基づいてどの実装が必要ですか?
キャッシュ名に基づくのではなく、 CacheManager に基づく可能性がある場合、そのうちの1つをPrimary CacheManager
、 次のように:
@Configuration
@EnableCaching
@PropertySource(value = { "classpath:/cache.properties" })
public class CacheConfig {
@Bean
@Primary
public CacheManager hazelcastCacheManager() {
ClientConfig config = new ClientConfig();
HazelcastInstance client = HazelcastClient.newHazelcastClient(config);
return new HazelcastCacheManager(client);
}
@Bean
public CacheManager guavaCacheManager() {
GuavaCacheManager cacheManager = new GuavaCacheManager("mycache");
CacheBuilder<Object, Object> cacheBuilder = CacheBuilder.newBuilder()
.maximumSize(100)
.expireAfterWrite(10, TimeUnit.MINUTES);
cacheManager.setCacheBuilder(cacheBuilder);
return cacheManager;
}
}
そしてクラスレベルで次のように指定します:
@Service
@CacheConfig(cacheManager="hazelcastCacheManager")
public class EmployeeServiceImpl implements IEmployeeService {
}
またはメソッドレベルで:
@Service
public class EmployeeServiceImpl implements IEmployeeService {
@Override
@Cacheable(value = "EMPLOYEE_", key = "#id", cacheManager= "guavaCacheManager")
public Employee getEmployee(int id) {
return new Employee(id, "A");
}
}
キャッシュ名のみに固執する必要がある場合は、複数のCacheManagerを使用できます。
2つのオプションがあります。
1つは@Arpitが述べたとおりです。複数のCacheManagerを定義し、メソッドレベルのアノテーション(@ Cacheable、@ CachePutなど)またはクラスレベルのアノテーション(@CacheConfig)で指定します。
カスタム注釈を作成することもできます。
@CacheConfig(cacheManager = "guavaCacheManager")
@Target(value = ElementType.TYPE)
@Retention(value = RetentionPolicy.RUNTIME)
public @interface GuavaCacheable {
}
@GuavaCacheable
@Service
public class MyServiceImpl implements MyService {
}
また、2番目のオプションとして、キャッシュのニーズが複雑な場合は、カスタムキャッシュリゾルバーを作成できます。
複数のCacheManagerを管理し、有効化/無効化をサポートするカスタムCacheResolverを ここ で探すことができます。しかし、ほとんどの場合、CacheResolverはやり過ぎです。