Redis устанавливает объект как пустой json «{}» при использовании Spring Boot

#spring-boot #redis #spring-data-redis

#spring-boot #redis #spring-data-redis

Вопрос:

Я пытаюсь установить объект на redis. Конфигурация RedisTemplate показана ниже.

 @Bean
fun redisTemplate(): RedisTemplate<String, Any> {
    val redisTemplate = RedisTemplate<String, Any>()
    redisTemplate.connectionFactory = jedisConnectionFactory()
    redisTemplate.defaultSerializer = GenericJackson2JsonRedisSerializer()
    redisTemplate.keySerializer = StringRedisSerializer()
    redisTemplate.hashKeySerializer = GenericJackson2JsonRedisSerializer()
    redisTemplate.valueSerializer = GenericJackson2JsonRedisSerializer()

    redisTemplate.afterPropertiesSet()
    return redisTemplate
}
  

вот моя строка настройки

redisUtil.redisTemplate().opsForValue().set("CATEGORIES", tree)

и в результате получается

 127.0.0.1:6379> keys *
1) "CATEGORIES"
127.0.0.1:6379> GET CATEGORIES
"{}"
127.0.0.1:6379> 
  

Ответ №1:

Если вы хотите сохранить объект, вы можете использовать хэш

 Pet pet = new Pet();
pet.setHeight(10);
pet.setName("tommy");

ObjectMapper oMapper = new ObjectMapper();

template.opsForHash().putAll("pet", oMapper.convertValue(pet, Map.class));

Pet pet1 = oMapper.convertValue(template.opsForHash().entries("pet"), Pet.class);
System.out.println(pet1.getName());
System.out.println(pet1.getHeight());
System.out.println(pet1.getWeight());
  

Конфигурация RedisTemplate

 @Bean
public RedisTemplate<String, Object> redisTemplate() {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());
template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
template.setConnectionFactory(jedisConnectionFactory());
template.setEnableTransactionSupport(true);
return template;
}
  

Если вы хотите сохранить его как пару ключ-значение

 Pet pet = new Pet();
pet.setHeight(10);
pet.setName("tommy");

template.opsForValue().set("pettest", pet);
Pet pet2 = (Pet) template.opsForValue().get("pettest");
System.out.println("boo boo");
System.out.println(pet2.getName());
  

результат get pettest в redis
{"@class":"com.cisco.rediscluster.Pet","name":"tommy","height":10}

Комментарии:

1. Я могу, но должен ли я?, Я имею в виду, нет ли способа сохранить объект целиком, а не часть карты? Если нет, то почему?

2. вторая часть моего ответа заключается в сохранении всего объекта, вам просто нужно ввести приведение его к правильному классу при чтении данных, в вашем случае дерева