序列化最終的目的是為了物件可以跨平台存儲,和進行網路傳輸。 而我們進行跨平台儲存和網路傳輸的方式就是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為什麼要序列化的詳細內容。更多資訊請關注PHP中文網其他相關文章!