我正在使用RedisCacheManager将我的缓存数据存储在我的spring-boot应用程序中。默认的串行器似乎将所有内容序列化为字节,并从字节序列化到适当的java类型。
但是,我想将缓存数据存储为json,以便我可以从非java客户端读取它。
我发现从默认值切换到其他序列化程序,例如Jackson2JsonRedisSerializer应该可以正常工作。执行此操作后,反序列化阶段失败。
的pom.xml
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
CacheConfig.java
@Configuration
@EnableCaching
public class CacheConfig {
@Bean
public RedisConnectionFactory createRedisConnectionFactory() {
JedisConnectionFactory factory = new JedisConnectionFactory();
factory.setHostName("localhost");
return factory;
}
// SPRING-DATA-REDIS ALREADY PROVIDES A STRING REDIS TEMPLATE, SO THE FOLLOWING IS NOT NECESSARY
// @Bean
// public RedisTemplate<String, String> createRedisTemplate(RedisConnectionFactory factory) {
// RedisTemplate<String, String> redisTemplate = new RedisTemplate<>();
// redisTemplate.setConnectionFactory(factory);
// return redisTemplate;
// }
@Bean
public CacheManager redisCacheManager(RedisTemplate redisTemplate) {
RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);
return cacheManager;
}
}
有没有办法以纯JSON格式存储它们并成功从中反序列化?
答案 0 :(得分:12)
在您的配置中添加此项以在redis模板中显式设置jackson序列化程序。
library(dplyr)
dfN %>%
group_by(day, place) %>%
mutate(cum_count = cumsum(count),
percentage = 100*cum_count/sum(count),
low_time = time_spent[which.max(percentage > 75)-1],
high_time = time_spent[low_time+1])
答案 1 :(得分:2)
至少从spring-data-jpa:2.0.2.RELEASE起,配置默认的redis模板不会影响@Cacheable注释系列访问redis的方式。 无论如何,由于我要使用redis模板做更多的事情,所以这不是我想要做的。
但是,这将隔离缓存管理器的配置并按预期工作:
@Configuration
@EnableCaching
public class RedisCacheManagerConfiguration {
@Autowired
private RedisConnectionFactory redisConnectionFactory;
@Bean
public CacheManager redisCacheManager() {
RedisSerializationContext.SerializationPair<Object> jsonSerializer =
RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer());
return RedisCacheManager.RedisCacheManagerBuilder
.fromConnectionFactory(redisConnectionFactory)
.cacheDefaults(
RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofDays(1))
.serializeValuesWith(jsonSerializer)
)
.build();
}
}
它使用Redis的通用Json序列化器(GenericJackson2JsonRedisSerializer)。
您还可以配置缓存管理器的其他方面,例如Redis中密钥的生存时间。
答案 2 :(得分:1)
我设法通过定义RedisConnectionFactory
来实现这一点@Bean
public RedisConnectionFactory jedisPool()
{
JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(new JedisPoolConfig());
jedisConnectionFactory.setHostName("localhost");
return jedisConnectionFactory;
}
然后使用StringRedisTemplate
ValueOperations<String, String> ops = redisTemplate.opsForValue();
ops.set("key", "Json_string");
我希望这可能有所帮助!