Redis的序列化與反序列化的概念

本篇內(nèi)容介紹了“redis的序列化與反序列化的概念”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

目前成都創(chuàng)新互聯(lián)公司已為1000+的企業(yè)提供了網(wǎng)站建設(shè)、域名、雅安服務(wù)器托管、網(wǎng)站托管運營、企業(yè)網(wǎng)站設(shè)計、鎮(zhèn)平網(wǎng)站維護等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。

序列化概念  

  • 序列化:把對象轉(zhuǎn)化為可傳輸?shù)淖止?jié)序列過程稱為序列化。

  • 反序列化:把字節(jié)序列還原為對象的過程稱為反序列化。

為什么需要序列化

  • 序列化最終的目的是為了對象可以跨平臺存儲,和進行網(wǎng)絡(luò)傳輸。而我們進行跨平臺存儲和網(wǎng)絡(luò)傳輸?shù)姆绞骄褪荌O,而我們的IO支持的數(shù)據(jù)格式就是字節(jié)數(shù)組。

  • 因為我們單方面的只把對象轉(zhuǎn)成字節(jié)數(shù)組還不行,因為沒有規(guī)則的字節(jié)數(shù)組我們是沒辦法把對象的本來面目還原回來的,所以我們必須在把對象轉(zhuǎn)成字節(jié)數(shù)組的時候就制定一種規(guī)則(序列化),那么我們從IO流里面讀出數(shù)據(jù)的時候再以這種規(guī)則把對象還原回來(反序列化)。

  • 如果我們要把一棟房子從一個地方運輸?shù)搅硪粋€地方去,序列化就是我把房子拆成一個個的磚塊放到車子里,然后留下一張房子原來結(jié)構(gòu)的圖紙,反序列化就是我們把房子運輸?shù)搅四康牡匾院?,根?jù)圖紙把一塊塊磚頭還原成房子原來面目的過程

什么情況下需要序列化

  • 通過上面我想你已經(jīng)知道了凡是需要進行“跨平臺存儲”和”網(wǎng)絡(luò)傳輸”的數(shù)據(jù),都需要進行序列化。

  • 本質(zhì)上存儲和網(wǎng)絡(luò)傳輸 都需要經(jīng)過 把一個對象狀態(tài)保存成一種跨平臺識別的字節(jié)格式,然后其他的平臺才可以通過字節(jié)信息解析還原對象信息。

序列化只是一種拆裝組裝對象的規(guī)則,那么這種規(guī)則肯定也可能有多種多樣,比如現(xiàn)在常見的序列化方式有:JDK(不支持跨語言)、JSON、XML、Hessian、Kryo(不支持跨語言)、Thrift、Protostuff、FST(不支持跨語言)。

Java  序列化

 

java 實現(xiàn)序列化很簡單,只需要實現(xiàn)Serializable 接口即可。

Redis的序列化與反序列化的概念

注意: JAVA序列化中常見的問題

問題一:static 屬性不能被序列化

原因:序列化保存的是對象的狀態(tài),靜態(tài)變量屬于類的狀態(tài),因此 序列化并不保存靜態(tài)變量。

問題二:Transient 屬性不會被序列化

java 的 transient 關(guān)鍵字的作用是需要實現(xiàn) Serilizable 接口,將不需要序列化的屬性前添加關(guān)鍵字 transient,序列化對象的時候,這個屬性就不會序列化到指定的目的地中。 

問題三:序列化版本號serialVersionUID

所有實現(xiàn)序列化的對象都必須要有個版本號,這個版本號可以由我們自己定義,當(dāng)我們沒定義的時候JDK工具會按照我們對象的屬性生成一個對應(yīng)的版本號。使用JDK生成的 serialVersionUID,只要對象有一丁點改變serialVersionUID就會隨著變更。因此建議自己手動定義該版本號。

redis序列化方式對比:

redis 的默認(rèn)方式是 JdkSerializationRedisSerializer。

JdkSerializationRedisSerializer:使用JDK提供的序列化功能。優(yōu)點是反序列化時不需要提供類型信息(class),但缺點是需要實現(xiàn)Serializable接口,還有序列化后的結(jié)果非常龐大,是JSON格式的5倍左右,這樣就會消耗redis服務(wù)器的大量內(nèi)存。

Jackson2JsonRedisSerializer:使用Jackson庫將對象序列化為JSON字符串。優(yōu)點是速度快,序列化后的字符串短小精悍,不需要實現(xiàn)Serializable接口。但缺點也非常致命,那就是此類的構(gòu)造函數(shù)中有一個類型參數(shù),必須提供要序列化對象的類型信息(.class對象)。通過查看源代碼,發(fā)現(xiàn)其只在反序列化過程中用到了類型信息。

問題:使用默認(rèn)的JDK序列化方式,在RDM工具中查看k-v值時會出現(xiàn)“亂碼”,不方便查看。

解決:自定義系列化方式,使用Jackson2JsonRedisSerializer

Redis的序列化與反序列化的概念

         

Redis 序列化

當(dāng)你用Redis的key和value時,value對于redis來講就是個byte array。你要自己負(fù)責(zé)把你的數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換成byte array,等讀取時再讀出來。

一個特例是字符串,因為字符串自己幾乎就已經(jīng)是byte array了,所以不需要自己處理。

Redis的序列化與反序列化的概念

Spring 的 redisTemplate 默認(rèn)會使用 java serialization 做序列化。你也可以用 StringRedisTemplate,那么你 set 的所有數(shù)據(jù)都會被 toString 一下再存到 redis 里。但這個 toString 不一定能反解析的回來。如果使用 java 原生序列化方式,可能會有遠程代碼執(zhí)行問題,因此建議使用其他序列化方式代替。

“Redis的序列化與反序列化的概念”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

網(wǎng)頁標(biāo)題:Redis的序列化與反序列化的概念
本文來源:http://muchs.cn/article40/ppjsho.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供、網(wǎng)頁設(shè)計公司做網(wǎng)站、面包屑導(dǎo)航關(guān)鍵詞優(yōu)化、品牌網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設(shè)計