当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《使用spring-data-redis将原始json存储在redis中》经验,为你挑选了2个好方法。

我正在使用RedisCacheManager将我的缓存数据存储在我的spring-boot应用程序中.默认的串行器似乎将所有内容序列化为字节,并从字节序列化到适当的java类型.

但是,我想将缓存数据存储为json,以便我可以从非Java客户端读取它.

我发现从默认的切换到其他序列化器,如Jackson2JsonRedisSerializer应该可以工作.执行此操作后,反序列化阶段失败.

的pom.xml

    
        org.springframework.data
        spring-data-redis
    

    
        redis.clients
        jedis
    

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 createRedisTemplate(RedisConnectionFactory factory) {
//        RedisTemplate redisTemplate = new RedisTemplate<>();
//        redisTemplate.setConnectionFactory(factory);
//        return redisTemplate;
//    }

    @Bean
    public CacheManager redisCacheManager(RedisTemplate redisTemplate) {
        RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);
        return cacheManager;
    }
}

有没有办法以纯JSON格式存储它们并成功从中反序列化?



1> Monzurul Haq..:

在您的配置中添加此项以在redis模板中显式设置jackson序列化程序.

public @Bean RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory) {

    RedisTemplate template = new RedisTemplate<>();
    template.setConnectionFactory(connectionFactory);
    template.setDefaultSerializer(new GenericJackson2JsonRedisSerializer());
    template.setKeySerializer(new StringRedisSerializer());
    template.setHashKeySerializer(new GenericJackson2JsonRedisSerializer());
    template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
    return template;
}



2> nimai..:

至少从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 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中密钥的生存时间。

推荐阅读
勤奋的瞌睡猪_715
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有