我正在将我的Spring应用程序从Spring-boot 1.5.9迁移到Spring-boot 2.0.0.有了这个新的Spring包,我在Redis中缓存数据时遇到了一些问题.
在我的配置中,我有3个不同的TTL(长,中,短)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序列化的所有内容.
是否可以将CacheManager配置为使用RestTemplate以及如何使用?如果不可能,我该怎么做才能使用JacksonSerializer而不是JdkSerializer?
我终于找到了一个有效的解决方 我无法配置CacheManager来使用我的RedisTemplate,但我可以像这样设置Serializer:
@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方法是关键.