>  기사  >  데이터 베이스  >  SpringBoot에서 Redis 직렬화 잘못된 코드를 해결하는 방법

SpringBoot에서 Redis 직렬화 잘못된 코드를 해결하는 방법

王林
王林앞으로
2023-05-27 11:34:061814검색

SpringBoot에서 Redis 직렬화 잘못된 코드

프로젝트의 원래 직렬화 솔루션은 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 직렬화 규칙을 구성합니다.

SpringBoot에서 Redis를 소개하는 것은 매우 간단합니다. 다음 주석을 추가합니다.

SpringBoot에서 Redis 직렬화 잘못된 코드를 해결하는 방법

그런 다음 application.yml에 Redis 구성을 추가합니다.

SpringBoot에서 Redis 직렬화 잘못된 코드를 해결하는 방법

참고: 몇 가지 주석이 있습니다. 비밀번호 등의 추가 구성은 문제를 방지하기 위해 여기에 쓰지 않겠습니다.

이제 테스트 클래스를 작성할 수 있습니다

SpringBoot에서 Redis 직렬화 잘못된 코드를 해결하는 방법

테스트 후 문제를 발견했습니다. test:1과 같은 키가 깨졌습니다. 예를 들어,

Another.Redis.Desktop.Manager 도구를 사용하여 볼 때 일련의 이상한 문자열로 바뀌는 것을 발견했습니다.

코드가 깨졌습니다.

이는 Redis 기본 직렬화 규칙으로 인해 발생합니다. RedisTemplate의 모든 기본 직렬화 규칙은 JDKSerializer이고, StringRedisTemplate의 기본 직렬화 규칙은 StringRedisSerializer입니다.

자세한 내용은 아래 그림을 참조하세요

SpringBoot에서 Redis 직렬화 잘못된 코드를 해결하는 방법

SpringBoot에서 Redis 직렬화 잘못된 코드를 해결하는 방법

구성해야 합니다

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제