프로젝트의 원래 직렬화 솔루션은 JDK 직렬화 클래스를 사용했지만 이를 Redis에 저장하면 잘못된 코드가 생성되어 보기 및 관리가 불편합니다.
public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) { redisTemplate.setKeySerializer(new JdkSerializationRedisSerializer(Object.class.getClassLoader())); redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer(Object.class.getClassLoader())); redisTemplate.setHashKeySerializer(new JdkSerializationRedisSerializer(Object.class.getClassLoader())); redisTemplate.setHashValueSerializer(new JdkSerializationRedisSerializer(Object.class.getClassLoader())); this.redisTemplate = redisTemplate; }
온라인 확인 결과, 직렬화 클래스에 문제가 있어서 발생합니다. 저희는 jdk의 직렬화 방식을 사용하지 않고 json 형식을 사용하고 있습니다
public void setRedisTemplate(RedisTemplate<String, Object> redisTemplate) { redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer()); redisTemplate.setHashKeySerializer(new StringRedisSerializer()); redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer()); this.redisTemplate = redisTemplate; }
위 직렬화기 사용시 꼭 확인해야 할 사항입니다. 엔터티 클래스의 모든 get 메서드는 속성 필드를 사용할 수 있습니다. 그렇지 않으면 대화를 역직렬화할 때 문제가 발생합니다. @JsonIgnore 주석을 추가할 필요가 없으면 직렬화 중에 무시됩니다.
SpringBoot에서 Redis를 소개하는 것은 매우 간단합니다. 다음 주석을 추가합니다.
그런 다음 application.yml에 Redis 구성을 추가합니다.
참고: 몇 가지 주석이 있습니다. 비밀번호 등의 추가 구성은 문제를 방지하기 위해 여기에 쓰지 않겠습니다.
테스트 후 문제를 발견했습니다. test:1과 같은 키가 깨졌습니다. 예를 들어,
Another.Redis.Desktop.Manager 도구를 사용하여 볼 때 일련의 이상한 문자열로 바뀌는 것을 발견했습니다.
코드가 깨졌습니다.
이는 Redis 기본 직렬화 규칙으로 인해 발생합니다. RedisTemplate의 모든 기본 직렬화 규칙은 JDKSerializer이고, StringRedisTemplate의 기본 직렬화 규칙은 StringRedisSerializer입니다.
package com.eknown.config; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; /** * redis配置 * 主要是配置Redis的序列化规则,用Jackson2JsonRedisSerializer替换默认的jdkSerializer * @author zhangfanghao * @version 1.0 * @date 2019-07-21 21:04 */ @Configuration public class RedisConfig { @Bean public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) { RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(connectionFactory); // 使用Jackson2JsonRedisSerialize替换默认序列化 Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper objectMapper = new ObjectMapper(); objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(objectMapper); // 设置key和value的序列化规则 redisTemplate.setValueSerializer(jackson2JsonRedisSerializer); redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.afterPropertiesSet(); return redisTemplate; } }
참고: 여기서는 Key와 Value의 직렬화 규칙만 재설정되고, hash-key와 hash- value 규칙은 참조로 설정할 수 있습니다.
위 내용은 SpringBoot에서 Redis 직렬화 잘못된 코드를 해결하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!