我正在将我的 Spring 应用程序从 Spring-boot 1.5.9 迁移到 Spring-boot 2.0.0。 有了这个新的 Spring 包,我在 Redis 中缓存数据时遇到了一些问题。
在我的配置中,我有 3 个具有不同 TTL(长、中、短)的缓存管理器:
@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 序列化的所有内容。
是否可以将 CacheManager 配置为使用 RestTemplate 以及如何配置? 如果不可能,我该怎么做才能使用 JacksonSerializer 而不是 JdkSerializer?
最佳答案
我终于找到了可行的解决方案。 我无法将 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 方法是关键。
关于java - 如何将 Spring Cache Redis 与自定义 RestTemplate 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48991608/