SpringアプリケーションをSpring-boot 1.5.9からSpring-boot 2.0.0に移行しています。この新しいSpringバンドルでは、Redisでのデータのキャッシュにいくつか問題があります。
私の構成では、異なるTTL(long、medium、short)の3つのCacheManagerがあります:
@Bean(name = "longLifeCacheManager")
public CacheManager longLifeCacheManager() {
RedisCacheConfiguration cacheConfiguration =
RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofSeconds(redisExpirationLong))
.disableCachingNullValues();
return RedisCacheManager.builder(jedisConnectionFactory()).cacheDefaults(cacheConfiguration).build();
}
カスタムRestTemplateもあります。
@Bean
public RedisTemplate<?, ?> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<?, ?> template = new RedisTemplate<>();
template.setDefaultSerializer(new GenericJackson2JsonRedisSerializer());
template.setConnectionFactory(connectionFactory);
return template;
}
以前のSpringバージョンでは、キャッシュされるすべてのデータはこのRestTemplateを使用し、GenericJackson2JsonRedisSerializerでシリアル化されました。
新しいSpringバージョンでは、CacheManagerはRestTemplateを使用せず、独自のSerializationPairを使用します。これにより、デフォルトのJdkSerializationRedisSerializerを使用してすべてがシリアル化されます。
RestTemplateを使用するようにCacheManagerを構成することは可能ですか?それが不可能な場合、JdkSerializerの代わりにJacksonSerializerを使用するにはどうすればよいですか?
私は最終的に実用的な解決策を見つけました。 CacheManagerを設定してRedisTemplateを使用することはできませんが、シリアライザを次のように設定できます。
@Bean(name = "longLifeCacheManager")
public CacheManager longLifeCacheManager(JedisConnectionFactory jedisConnectionFactory) {
RedisCacheConfiguration cacheConfiguration =
RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofSeconds(redisExpirationLong))
.disableCachingNullValues()
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));
return RedisCacheManager.builder(jedisConnectionFactory).cacheDefaults(cacheConfiguration).build();
}
SerializeValuesWithメソッドが重要です。