首頁 >資料庫 >Redis >redis為什麼要序列化

redis為什麼要序列化

(*-*)浩
(*-*)浩原創
2019-11-22 10:33:048998瀏覽

redis為什麼要序列化

序列化最終的目的是為了物件可以跨平台存儲,和進行網路傳輸。 而我們進行跨平台儲存和網路傳輸的方式就是IO,而我們的IO支援的資料格式就是位元組數組。              (建議學習:Redis視訊教學

透過上面我想你已經知道了凡是需要進行「跨平台儲存」和」網路傳輸」的數據,都需要進行序列化。

本質上儲存和網路傳輸 都需要經過 把一個物件狀態保存成一種跨平台識別的位元組格式,然後其他的平台才可以透過位元組資訊解析還原物件資訊。

redis序列化方式比較:

redis的預設方式是JdkSerializationRedisSerializer

##JdkSerializationRedisSerializer: 使用JDKerializationRedisSerializer

##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為什麼要序列化的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn