java - 如何将 Spring Cache Redis 与自定义 RestTemplate 一起使用?

标签 java spring spring-boot caching redis

我正在将我的 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/

相关文章:

java - Spring表达式语言的具体使用

java - native 查询中未设置参数

java - 有没有办法在拖放中达到下降时刻?

java - Spring TransactionProxyFactoryBean 仅在从外部类调用方法时才支持事务

java - 使用 JDBC 连接访问表时如何知道表被锁定或正在被其他人读取?

java - Spring AOP - 未调用切入点/拦截器

java - 无法在 spring JPA 中使用 find By 前缀创建自定义方法

css - spring boot + thymeleaf 3+bootStrap,配置bootstrap返回404错误

java - Eclipse 系统.属性 Windows 7

Java 比较器 - 函数访问