使用spring-data-redis将原始json存储在redis中

时间:2017-01-26 14:24:26

标签: java json spring serialization spring-data

我正在使用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格式存储它们并成功从中反序列化?

3 个答案:

答案 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");

我希望这可能有所帮助!