首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用spring-data-redis在redis中存储原始json

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

Stack Overflow用户
提问于 2017-01-26 22:24:26
回答 3查看 17.7K关注 0票数 10

我使用RedisCacheManager在spring-boot应用程序中存储缓存数据。默认序列化程序似乎将所有内容序列化为byte,并将其从byte反序列化为适当的java类型。

但是,我希望将缓存数据存储为json,这样我就可以从非java客户端读取它。

我发现从默认序列化程序切换到其他序列化程序(如Jackson2JsonRedisSerializer )应该可以工作。完成此操作后,反序列化阶段将失败。

pom.xml

代码语言:javascript
复制
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-redis</artifactId>
    </dependency>

    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
    </dependency>

CacheConfig.java

代码语言:javascript
复制
@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格式反序列化?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-01-27 14:17:12

将其添加到您的配置中,以便在redis模板中显式设置jackson序列化程序。

代码语言:javascript
复制
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;
}
票数 17
EN

Stack Overflow用户

发布于 2018-10-04 22:21:37

至少在spring-data-jpa:2.0.2.RELEASE中,配置默认的redis模板不会影响@Cacheable注释族访问redis的方式。无论如何,因为我使用的是redis模板,所以这不是我想要做的事情。

然而,这隔离了缓存管理器的配置,并按预期工作:

代码语言:javascript
复制
@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中键的生存时间。

票数 10
EN

Stack Overflow用户

发布于 2017-01-27 20:58:54

我通过定义RedisConnectionFactory成功做到了这一点

代码语言:javascript
复制
@Bean
public RedisConnectionFactory jedisPool()
{
    JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(new JedisPoolConfig());
    jedisConnectionFactory.setHostName("localhost");

    return jedisConnectionFactory;
}

然后使用StringRedisTemplate

代码语言:javascript
复制
ValueOperations<String, String> ops = redisTemplate.opsForValue();
ops.set("key", "Json_string");

我希望这能有所帮助!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41875635

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档