当前位置: 首页 > 知识库问答 >
问题:

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

薛淳
2023-03-14

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

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

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

波姆。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个答案

谢和颂
2023-03-14

我通过定义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");

我希望这会有帮助!

甄煜
2023-03-14

截至Spring数据jpa:2.0.2。至少,配置默认的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();
    }

}

它使用Redis的通用Json序列化器(GenericJackson2JsonRedisSerializer)。

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

赵珂
2023-03-14

将其添加到配置中,以在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;
}
 类似资料:
  • 我在本地配置了redis sentinel,在两个不同的端口10001和10002上运行。我有相同的sentinel身份验证设置。 Redis哨兵配置 使用的JAR版本 Spring-data-redis:2.0.10。发布 莴苣(io.莴苣.莴苣芯):5.0.5.RELEASE 在尝试连接到redisSentinelConfiguration时,我一直收到NOAUTH身份验证请求错误 使用Spr

  • 问题内容: 我需要在Spring Data Repository中使用原始SQL,这可能吗?我看到的所有内容始终都是基于实体的。 问题答案: @Query批注允许通过将nativeQuery标志设置为true来执行本地查询。 引用Spring Data JPA 参考文档。

  • 问题内容: 我对Redis中的HSET有疑问。据我所知,redis是一个键值数据库。这意味着所有事物都存储为键值,例如,我们没有表。我想在redis中保存一些内容,所以我决定使用Hashmap。由于HMSET已过时,我们应该改用HSET,我应该如何在hset中存储许多属性作为值和id作为键?你知道我想保存这样的东西: 但是,如果我要保存很多字段,我应该为每个字段写这一行?例如 : 如在HSET中,

  • 问题内容: hmset函数可以设置每个字段的值,但是我发现,如果值本身是一个复杂的结构化对象,则从hget返回的值是一个序列化的字符串,而不是原始对象 例如 i的类型是字符串,而不是python对象,除了手动解析每个字段外,还有什么方法可以解决此问题? 问题答案: 您无法在Redis中创建嵌套结构,这意味着您无法(例如)在本地Redis哈希图中存储本地Redis列表。 如果确实需要嵌套结构,则可能

  • 问题内容: 我在Redis中存储MessagePacked哈希时遇到问题。我在下面粘贴了一个测试用例。从Redis中提取打包数据并对其进行解压缩时,哈希会略有损坏。当哈希值超出一定长度时,似乎会发生这种情况,尽管我不能肯定地说。 我正在使用Redis 2.4.17(默认配置),Ruby 1.9.3p194,MessagePack 0.4.7和Redis gem 3.0.2。使用节点也会发生相同的问

  • 我正在寻找一种方法来传输任何文件类型的原始文件数据和任何可能的内容(我的意思是文件和文件内容都是用户生成的),在主干前端使用xhr/ajax调用,在Django后端使用这两种方法。 编辑:也许这个问题还不清楚... 如果在IDE中打开一个文件(如Sublime),则可以查看和编辑组成该文件的实际代码。我试图将原始内容放入JSON中,这样我就可以发送到浏览器,修改后再发送回去。 我发布这个问题是因为