【问题标题】:Redis how to store values as jsonRedis如何将值存储为json
【发布时间】:2020-02-29 14:03:24
【问题描述】:

我在我的应用程序中使用 redis 作为我的缓存存储。为此,我使用以下 redis 配置:

@Configuration
@EnableCaching
public class SpringRedisConfig {
@Bean
public JedisConnectionFactory connectionFactory() {
    JedisConnectionFactory connectionFactory = new JedisConnectionFactory();
    connectionFactory.setHostName("localhost");
    connectionFactory.setPort(6379);
    return connectionFactory;
}

@Bean
public RedisTemplate<String, Object> redisTemplate() {
    RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
    redisTemplate.setConnectionFactory(connectionFactory());
    redisTemplate.setKeySerializer(new StringRedisSerializer());


    RedisSerializer<String> redisSerializer = new StringRedisSerializer();

    Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
    ObjectMapper om = new ObjectMapper();
    om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
    om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
    jackson2JsonRedisSerializer.setObjectMapper(om);

    //template.setConnectionFactory(factory);
    redisTemplate.setKeySerializer(redisSerializer);
    redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
    redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);


    return redisTemplate;
}
}

在我将数据存储在缓存中的服务中,我使用@Cacheable 如下:

@Cacheable(value = "institute_detail_cache", key = "'inst_'+#instituteId")
public Map<String, String> getDetailsFromCache(Long instituteId) {
    log.info("not found in cache.....");

    Map<String, String> map = new HashMap<>();
    map.put("name", "kayv");
    map.put("age", "20");

    return map;
}

代码运行良好,并将数据作为对象存储在缓存中。这是我从 redis cli 获得的值:

但我的要求是将数据(值)存储为 json,并带有键值对。这就是为什么我使用 Jackson2JsonRedisSerializer 进行值序列化的原因。

谁能建议我做错了什么?

我需要实现什么才能使我的类存储为 json 而不是我在此示例中使用的 map?

【问题讨论】:

标签: java json caching redis jedis


【解决方案1】:

使用 GenericJackson2JsonRedisSerializer 类而不是 Jackson2JsonRedisSerializer 类解决了我的问题。

创建了一个新的配置类(RedisCacheManagerConfiguration.java)而不是旧的 SpringRedisConfig.java。

@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中get的结果吗? @KayV
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-08
  • 2011-08-09
  • 1970-01-01
  • 1970-01-01
  • 2017-06-12
  • 1970-01-01
相关资源
最近更新 更多