序列化终究的目标是为了对象能够跨平台存储,和举行收集传输。而我们举行跨平台存储和收集传输的体式格局就是IO,而我们的IO支撑的数据花样就是字节数组。 (引荐进修:Redis视频教程)

经由历程上面我想你已知道了通常须要举行“跨平台存储”和”收集传输”的数据,都须要举行序列化。

本质上存储和收集传输 都须要经由 把一个对象状况保留成一种跨平台辨认的字节花样,然后其他的平台才能够经由历程字节信息剖析复原对象信息。

redis序列化体式格局对照:

redis的默许体式格局是JdkSerializationRedisSerializer

JdkSerializationRedisSerializer: 运用JDK供应的序列化功用。

长处是反序列化时不须要供应范例信息(class),但瑕玷是须要完成Serializable接口,另有序列化后的效果异常巨大,是JSON花样的5倍摆布,如许就会斲丧redis服务器的大批内存。

Jackson2JsonRedisSerializer: 运用Jackson库将对象序列化为JSON字符串。

长处是速度快,序列化后的字符串短小精悍,不须要完成Serializable接口。

但瑕玷也异常致命,那就是此类的组织函数中有一个范例参数,必需供应要序列化对象的范例信息(.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为何要序列化的细致内容,更多请关注ki4网别的相干文章!

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐