本篇內(nèi)容介紹了“redis的序列化與反序列化的概念”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!
目前成都創(chuàng)新互聯(lián)公司已為1000+的企業(yè)提供了網(wǎng)站建設、域名、雅安服務器托管、網(wǎng)站托管運營、企業(yè)網(wǎng)站設計、鎮(zhèn)平網(wǎng)站維護等服務,公司將堅持客戶導向、應用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
序列化概念
序列化:把對象轉(zhuǎn)化為可傳輸?shù)淖止?jié)序列過程稱為序列化。
反序列化:把字節(jié)序列還原為對象的過程稱為反序列化。
為什么需要序列化
序列化最終的目的是為了對象可以跨平臺存儲,和進行網(wǎng)絡傳輸。而我們進行跨平臺存儲和網(wǎng)絡傳輸?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)絡傳輸”的數(shù)據(jù),都需要進行序列化。
本質(zhì)上存儲和網(wǎng)絡傳輸 都需要經(jīng)過 把一個對象狀態(tài)保存成一種跨平臺識別的字節(jié)格式,然后其他的平臺才可以通過字節(jié)信息解析還原對象信息。
序列化只是一種拆裝組裝對象的規(guī)則,那么這種規(guī)則肯定也可能有多種多樣,比如現(xiàn)在常見的序列化方式有:JDK(不支持跨語言)、JSON、XML、Hessian、Kryo(不支持跨語言)、Thrift、Protostuff、FST(不支持跨語言)。
Java 序列化
注意: JAVA序列化中常見的問題
問題一:static 屬性不能被序列化
原因:序列化保存的是對象的狀態(tài),靜態(tài)變量屬于類的狀態(tài),因此 序列化并不保存靜態(tài)變量。
問題二:Transient 屬性不會被序列化
java 的 transient 關鍵字的作用是需要實現(xiàn) Serilizable 接口,將不需要序列化的屬性前添加關鍵字 transient,序列化對象的時候,這個屬性就不會序列化到指定的目的地中。
問題三:序列化版本號serialVersionUID
所有實現(xiàn)序列化的對象都必須要有個版本號,這個版本號可以由我們自己定義,當我們沒定義的時候JDK工具會按照我們對象的屬性生成一個對應的版本號。使用JDK生成的 serialVersionUID,只要對象有一丁點改變serialVersionUID就會隨著變更。因此建議自己手動定義該版本號。
redis序列化方式對比:
redis 的默認方式是 JdkSerializationRedisSerializer。
JdkSerializationRedisSerializer:使用JDK提供的序列化功能。優(yōu)點是反序列化時不需要提供類型信息(class),但缺點是需要實現(xiàn)Serializable接口,還有序列化后的結(jié)果非常龐大,是JSON格式的5倍左右,這樣就會消耗redis服務器的大量內(nèi)存。
Jackson2JsonRedisSerializer:使用Jackson庫將對象序列化為JSON字符串。優(yōu)點是速度快,序列化后的字符串短小精悍,不需要實現(xiàn)Serializable接口。但缺點也非常致命,那就是此類的構(gòu)造函數(shù)中有一個類型參數(shù),必須提供要序列化對象的類型信息(.class對象)。通過查看源代碼,發(fā)現(xiàn)其只在反序列化過程中用到了類型信息。
問題:使用默認的JDK序列化方式,在RDM工具中查看k-v值時會出現(xiàn)“亂碼”,不方便查看。
解決:自定義系列化方式,使用Jackson2JsonRedisSerializer
Redis 序列化
當你用Redis的key和value時,value對于redis來講就是個byte array。你要自己負責把你的數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換成byte array,等讀取時再讀出來。
一個特例是字符串,因為字符串自己幾乎就已經(jīng)是byte array了,所以不需要自己處理。
Spring 的 redisTemplate 默認會使用 java serialization 做序列化。你也可以用 StringRedisTemplate,那么你 set 的所有數(shù)據(jù)都會被 toString 一下再存到 redis 里。但這個 toString 不一定能反解析的回來。如果使用 java 原生序列化方式,可能會有遠程代碼執(zhí)行問題,因此建議使用其他序列化方式代替。
“Redis的序列化與反序列化的概念”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識可以關注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!
網(wǎng)頁標題:Redis的序列化與反序列化的概念
本文來源:http://www.chinadenli.net/article40/ppjsho.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供、網(wǎng)頁設計公司、做網(wǎng)站、面包屑導航、關鍵詞優(yōu)化、品牌網(wǎng)站建設
聲明:本網(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)