我使用RedisCacheManager在spring-boot应用程序中存储缓存数据。默认序列化程序似乎将所有内容序列化为byte,并将其从byte反序列化为适当的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格式存储它们并成功地从JSON格式反序列化?
发布于 2017-01-27 14:17:12
将其添加到您的配置中,以便在redis模板中显式设置jackson序列化程序。
public @Bean RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<Object, Object> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory);
template.setDefaultSerializer(new GenericJackson2JsonRedisSerializer());
template.setKeySerializer(new StringRedisSerializer());
template.setHashKeySerializer(new GenericJackson2JsonRedisSerializer());
template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
return template;
}发布于 2018-10-04 22:21:37
至少在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中键的生存时间。
发布于 2017-01-27 20:58:54
我通过定义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");我希望这能有所帮助!
https://stackoverflow.com/questions/41875635
复制相似问题