Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用spring数据redis在redis中存储原始json_Java_Json_Spring_Serialization_Spring Data - Fatal编程技术网

Java 使用spring数据redis在redis中存储原始json

Java 使用spring数据redis在redis中存储原始json,java,json,spring,serialization,spring-data,Java,Json,Spring,Serialization,Spring Data,我正在使用RedisCacheManager在spring boot应用程序中存储缓存数据。默认序列化程序似乎将所有内容序列化为字节,并从字节反序列化为适当的java类型 但是,我希望将缓存数据存储为json,这样我就可以从非java客户端读取它 我发现从默认的序列化程序切换到其他序列化程序(如Jackson2JSONRedisalizer)应该可以工作。执行此操作后,反序列化阶段失败 pom.xml <dependency> <groupId>o

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

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

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

pom.xml

    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-redis</artifactId>
    </dependency>

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

org.springframework.data
spring数据redis
redis.clients
绝地武士
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;
    }
}
@配置
@启用缓存
公共类CacheConfig{
@豆子
公共RedisConnectionFactory createRedisConnectionFactory(){
JedisConnectionFactory=新的JedisConnectionFactory();
setHostName(“localhost”);
返回工厂;
}
//SPRING-DATA-REDIS已经提供了一个字符串REDIS模板,因此不需要以下内容
//@Bean
//公共RedisTemplate createRedisTemplate(RedisConnectionFactory工厂){
//RedisTemplate RedisTemplate=新RedisTemplate();
//redisTemplate.setConnectionFactory(工厂);
//返回模板;
//    }
@豆子
公共缓存管理器redisCacheManager(RedisTemplate RedisTemplate){
RedisCacheManager cacheManager=新的RedisCacheManager(redisTemplate);
返回缓存管理器;
}
}

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

将其添加到您的配置中,以便在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;
}
public@Bean RedisTemplate RedisTemplate(RedisConnectionFactory connectionFactory){
RedisTemplate=新RedisTemplate();
模板.setConnectionFactory(connectionFactory);
setDefaultSerializer(新的GenericJackson2JsonRedisSerializer());
setKeySerializer(新的StringRedisSerializer());
setHashKeySerializer(新的GenericJackson2JsonRedisSerializer());
setValueSerializer(新的GenericJackson2JsonRedisSerializer());
返回模板;
}

我通过定义RedisConnectionFactory实现了这一点

@Bean
public RedisConnectionFactory jedisPool()
{
    JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory(new JedisPoolConfig());
    jedisConnectionFactory.setHostName("localhost");

    return jedisConnectionFactory;
}
然后使用StringRedis模板

ValueOperations<String, String> ops = redisTemplate.opsForValue();
ops.set("key", "Json_string");
ValueOperations-ops=redisTemplate.opsForValue();
操作集(“键”、“Json_字符串”);

我希望这会有帮助

至少从spring data jpa:2.0.2.RELEASE开始,配置默认redis模板不会影响@Cacheable annotation系列访问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();
    }

}
@配置
@启用缓存
公共类重新缓存管理器配置{
@自动连线
私有RedisConnectionFactory RedisConnectionFactory;
@豆子
公共缓存管理器redisCacheManager(){
RedisSerializationContext.SerializationPair jsonSerializer=
RedisSerializationContext.SerializationPair.fromSerializer(新的GenericJackson2JsonRedisSerializer());
返回RedisCacheManager.RedisCacheManagerBuilder
.fromConnectionFactory(重新连接工厂)
.cacheDefaults(
RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(持续天数(1))
.serializeValuesWith(jsonSerializer)
)
.build();
}
}
它使用了Redis的通用Json序列化程序(GenericJackson2JsonRedisSerializer)


您还可以配置缓存管理器的其他方面,例如redis中密钥的生存时间。

我已经尝试过了,但redis中的缓存数据仍以字节为单位。像
“\xac\xed\x00\x05sr\x00\x0ejava.lang.Long;\x8b\xe4\x90\xcc\x8f\xdf\x02\x00\x00\x01J\x00\x05valuexr\x00\x10java.lang.Number\x86\xac\x95\x1d\x0b\x94\xe0\x8b\x02\x00\x00\x00xp\x00\x00\x00\x00\x00\x00\x00\x01”
你检查过我更新的答案了吗?让我知道。如果我们使用crudepository模式来持久化数据,这不起作用?这可能适用于较旧版本的spring data redis,但不适用于最新版本ATMYou是对的,如果您直接使用redisTemplate,您可以完全控制数据的进出。然而,在我的例子中,我使用了缓存注释,例如,
@Cacheable
@Cacheput
,其中cacheManager使用redisTemplate进行缓存操作。这会对您有所帮助吗?