>데이터 베이스 >Redis >Redis를 직렬화해야 하는 이유는 무엇입니까?

Redis를 직렬화해야 하는 이유는 무엇입니까?

(*-*)浩
(*-*)浩원래의
2019-11-22 10:33:049013검색

Redis를 직렬화해야 하는 이유는 무엇입니까?

직렬화의 궁극적인 목적은 개체를 플랫폼 전체에 저장하고 네트워크를 통해 전송할 수 있도록 하는 것입니다. 우리가 크로스 플랫폼 저장과 네트워크 전송을 수행하는 방식은 IO이고, 우리 IO가 지원하는 데이터 형식은 바이트 배열입니다. (추천 학습: Redis 비디오 튜토리얼 )

위를 통해 이미 "크로스 플랫폼 저장"과 "네트워크 전송"이 필요한 모든 데이터가 직렬화되어야 한다는 것을 알고 계실 것입니다.

기본적으로 스토리지와 네트워크 전송 모두 객체 상태를 크로스 플랫폼 인식 바이트 형식으로 저장해야 하며, 그러면 다른 플랫폼에서는 바이트 정보를 통해 객체 정보를 구문 분석하고 복원할 수 있습니다.

Redis 직렬화 방법 비교:

redis의 기본 방법은 JdkSerializationRedisSerializer

JdkSerializationRedisSerializer: JDK에서 제공하는 직렬화 기능을 사용합니다.

역직렬화 시 타입 정보(클래스)를 제공하지 않아도 된다는 장점이 있지만, 직렬화 가능 인터페이스를 구현해야 한다는 단점이 있고 직렬화 후 결과가 JSON의 5배 정도 되는 매우 큰 결과를 낳습니다. redis를 소비하는 형식입니다. 서버에 많은 메모리가 필요합니다.

Jackson2JsonRedisSerializer: Jackson 라이브러리를 사용하여 객체를 JSON 문자열로 직렬화합니다.

장점은 빠르고 직렬화된 문자열이 짧고 간결하며 직렬화 가능 인터페이스를 구현할 필요가 없다는 것입니다.

하지만 단점도 매우 치명적입니다. 즉, 이 클래스의 생성자에 유형 매개변수가 있고, 직렬화할 객체(.class 객체)의 유형 정보를 제공해야 한다는 것입니다. 소스 코드를 살펴보면 역직렬화 프로세스 중에 유형 정보만 사용한다는 것을 알 수 있습니다.

문제: 기본 JDK 직렬화 방법을 사용하면 RDM 도구에서 k-v 값을 볼 때 "깨진 문자"가 나타나 보기가 불편합니다.

해결책: 직렬화 방법을 사용자 정의하고 Jackson2JsonRedisSerializer를 사용하세요

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.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
 * Redis配置
 *
 * @author LinJie
 */
@Configuration
public class RedisConfig {

    /**
     * Redis repository redis repository.
     *
     * @param redisTemplate the redis template
     * @return the redis repository
     */
    @Bean
    public RedisRepository redisRepository(RedisTemplate redisTemplate) {
        // 使用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);
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        // key采用String的序列化方式
        redisTemplate.setKeySerializer(stringRedisSerializer);
        // hash的key也采用String的序列化方式
        redisTemplate.setHashKeySerializer(stringRedisSerializer);
        // value序列化方式采用jackson
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        // hash的value序列化方式采用jackson
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.afterPropertiesSet();
        return new RedisRepository(redisTemplate);
    }
}

더 많은 Redis 관련 기술 기사를 보려면 Redis 데이터베이스 사용 튜토리얼 열을 방문하여 알아보세요!

위 내용은 Redis를 직렬화해야 하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.