999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

面向Redis的數據序列化算法研究

2017-06-05 14:15:40孫杜靖李玲娟
計算機技術與發展 2017年5期
關鍵詞:數據庫

孫杜靖,李玲娟

(南京郵電大學 計算機學院,江蘇 南京 210003)

面向Redis的數據序列化算法研究

孫杜靖,李玲娟

(南京郵電大學 計算機學院,江蘇 南京 210003)

為了解決實時計算中半結構化和非結構化數據的存儲問題,借助內存數據庫Redis可以存儲鍵值型數據和支持全內存運算的優勢,結合文件序列化、圖像序列化、JSON序列化和Java對象序列化技術,設計了面向Redis的半結構化和非結構化數據的序列化算法。該序列化算法不僅解決了半結構化和非結構化數據無法直接存入Redis的問題,而且由于在序列化過程中實現了對這些數據的深拷貝,使得反序列化可以完美地還原初始數據。此外,序列化過程還支持通過加解密來保障數據安全。基于Storm平臺的實驗結果表明,所設計的序列化算法快速、有效且性能穩定。在海量數據實時計算中,無論使用哪種開發語言,將該算法與Redis數據庫結合,既能利用Redis帶來的高讀寫效率,又能存儲任何半結構化和非結構化數據對象而無需重復開發代碼。

Redis;序列化;半結構化;非結構化;Storm

0 引 言

大數據時代的到來使得半結構化數據、非結構化數據迅猛增長,而處理和存儲這些數據的需求也日益增長。傳統的關系型數據庫只能存儲結構化數據,并且對于高并發的數據寫操作、海量數據的存儲和快速查詢以及服務器的橫向擴展[1]顯得無能為力。為了解決這些問題,NoSQL[2](Not Only SQL)技術應運而生。NoSQL主要分為四類:鍵值(Key-Value)存儲數據庫、列存儲數據庫、文檔型數據庫和圖形數據庫。鍵值存儲數據庫使用哈希來構建數據庫,列存儲數據庫善于分布式存儲,文檔型、圖形數據庫顧名思義在文檔型、圖數據處理方面優勢明顯。

Redis(Remote Dictionary Server)[3]就是NoSQL中屬于鍵值存儲數據庫的一個產品,并且是一個內存型數據庫,全內存運算和存儲使其在高并發的操作下仍能保持高性能讀寫,是已知性能最快的Key-Value數據庫[4]。Key-Value模型的內存數據庫,支持多種語言接口,如C++、C#、Java、JavaScript、Python等。Key-Value數據庫利用哈希表維護Key值到具體數據(Value)的映射,通過Key值可以方便高效地查詢數據[5]。Redis通過緩存數據庫查詢結果,減少對硬盤的訪問次數,其緩存數據庫全部加載在內存中進行操作,定期通過異步快照或者日志操作將數據庫數據flush到硬盤上進行保存。因采用純內存操作,每秒可以處理超過10萬次讀寫操作,Redis性能非常高。Redis還有其他一些優勢,比如提供了豐富的數據結構、支持主從復制、完善的持久化機制等等。

實時計算中需要頻繁讀取數據,Redis通過訪問緩存數據庫讀取數據,可以保證計算過程中讀取需求的實時響應、數據庫數據的實時更新,因此Storm[6]等實時計算平臺借助Redis鍵值存儲和內存操作的優勢將能夠更好地完成流數據的實時處理任務。但是,采用全內存的Key-Value存儲形式,Redis雖然能滿足實時處理的需求,卻不能直接存儲和處理大量半結構化及非結構化數據,而這些數據是Storm等流式實時計算平臺必須面對的。

為此,設計了面向Redis的序列化算法,并通過在Storm平臺上的實現結果,證明了該算法在保證Redis高性能讀寫的前提下,解決實時計算中半結構和非結構化數據的存儲問題。

1 面向Redis的數據序列化算法設計思想

如上所述,要充分利用Redis的優勢,需要解決Redis作為鍵值型數據庫不能直接存儲和處理Storm等流式實時計算平臺必須面對的半結構化及非結構化數據的問題。為解決這一問題,可以利用Redis能夠存儲二進制流的特性,先將半結構化及非結構化數據進行序列化,然后存入Redis中,讀取后再進行反序列化,使Redis存儲各種數據成為可能。基于此思路,設計了面向Redis的序列化算法,該算法考慮了半結構化數據、非結構化數據和需要保密的數據。非結構化數據的序列化包括:采用文件流的序列化和圖數據序列化;半結構化數據的序列化包括:采用JSON[7]的序列化和采用Java對象的序列化。

圖1給出了算法的總體思想。

圖1 面向Redis的半結構化及非結構化數據序列化

數據發送端將半結構化或非結構化數據先序列化成二進制流或JSON字符串,如有敏感數據,可以將其加密,然后存入Redis數據庫;數據更新時,以半結構化數據為例,Value1值會隨之改變,但是存入的鍵Key1值不變,即Redis數據庫中存入的Value1值也是實時更新的,如果數據消費者想要查看此半結構化數據,可通過事先約定好的鍵Key1值來獲取數據,如曾經加密過,則需解密;然后將獲得的二進制流或JSON字符串進行反序列化,得到原始數據。由于Redis數據庫中存入的數據是實時更新的,數據消費者獲取的數據也是最近存入的數據,對于實時更新的半結構化數據只采用一個KEY值進行存儲的原因有三:一是通信雙方可以事先規定好KEY值,無需頻繁修改;二是Redis為內存型數據庫,讀寫速率快,完全可以支持數據的實時更新和實時讀取;三是若采用不同時刻不同KEY值,在實時計算中,會迅速占滿內存,使Redis可能無法再存入新的數據。

2 面向Redis的數據序列化算法描述

2.1 非結構化數據的序列化

非結構化數據即為不方便用傳統數據庫二維邏輯表來存儲的數據,包括文檔、文本、圖像、音頻、視頻等等。傳統數據庫通過創建一個三字段(編號number、內容描述varchar(1024)、內容blog)的表來對其進行索引,需要的人工參與量比較大,面對海量非結構化數據的存儲與檢索時,該方法顯然不可能在較短時間內將其整理入庫,數據的價值也無法很好地發揮。所設計的基于Redis的數據序列化算法采用將非結構化數據進行序列化后存入內存數據庫Redis中的方案,能很好地解決此類問題,具體包括采用文件流的序列化和圖數據序列化。

1)采用文件流序列化非結構數據。

對非結構化數據序列化分為兩個過程:序列化和反序列化,對應的方法分別是writeObject()和readObject()。

(1)writeObject():將非結構化數據A序列化(序列化過程)。

輸入:非結構化數據A,可以是文檔、圖像、音頻、視頻等等,路徑P

輸出:字節數組

步驟為:

①while(A更新一次)

②將A寫入到底層輸入流A';

③通過文件輸出流將A'以字節流的方式保存到指定路徑P;

④endwhile

(2)readObject():將指定路徑中的對象轉化為原始非結構化數據(反序列化過程)。

輸入:路徑P

輸出:原始非結構化數據A

步驟為:

①將路徑P中的對象讀入原始字節流A';

②從輸入流中讀取數據對象類數據A';

③將A'轉換成抽象Object類A;

④returnA

數據發送方通過writeObject()函數將非結構化數據序列化,然后將序列化的結果作為value存入Redis的某一路徑下,數據接收方先根據數據發送方存入的key取出相應的字節流,然后通過readObject()方法,將字節流反序列化為抽象類,而原始數據類型可能是文檔、圖像、音頻或視頻,反序列化后格式不變,可將其下載到某個路徑下查看,如若知道其為文檔,可以將其向下轉型成文件類,直接進行其他數據處理。

2)對圖數據的序列化。

圖像是非結構化數據的一種,視頻、圖像的實時計算處理過程中需要對大量照片進行存儲、計算。在線系統中,在線數據的備份和恢復和對原始數據進行測試需要使用到快照[7-8],而快照由于其實時更新,并且需要被不斷讀取和計算,對其進行存儲并保證其能被快速讀取顯得尤為重要。由于圖數據使用頻繁,頻繁的文件讀寫會增加時間開銷;另一方面,圖數據占用內存過大時,所涉及的內存消耗和網絡傳輸會很大,為了避免文件讀寫以減少時間開銷、內存消耗和網絡傳輸,采用如下的圖像序列化方案。該方案分為兩個過程:序列化和反序列化,對應的方法分別是writeImage()和byte2image()。

(1)writeObjectwriteImage():將圖像轉化成字節數組(序列化過程)。

輸入:實時更新的某張圖像A

輸出:字節數組

步驟為:

①while(A更新一次)

②將圖像A以某種格式(如png)寫入內存;

③字節輸出流捕獲內存緩沖區的數據A',轉換成字節數組B;

④endwhile

⑤returnB

(2)byte2image():將從Redis讀取的字節數組B轉化為圖像(反序列化過程)。

輸入:字節數組B

輸出:原始圖像A

步驟為:

①將字節數組B寫入圖像文件輸出流中;

②輸出流探測圖像格式,并調用對應的插件進行解碼,得到原始圖像A;

③eturnA

數據發送方通過writeImage()方法將圖像序列化,然后將序列化的結果作為value存入Redis,數據接收方先根據數據發送方存入的key取出相應的二進制流,然后通過byte2image()方法,將二進制流反序列化為圖像,直接進行數據處理。

2.2 半結構化數據的序列化算法

半結構化的數據有一定的結構性,但結構變化很大,OEM[9](Object Exchange Model)是它的典型代表。由于其結構性,需要了解數據內部細節,因而不能將其看成非結構化數據,像2.1節那樣將數據簡單組織成一個文件;又因其數據結構變化大,也不能將其按照結構化數據處理方式存入二維表。設計了兩種方法將其序列化后存入Redis數據庫,一種是采用JSON(JavaScript Object Notation)數據交換格式,另一種是利用Java對象序列化技術。

1)采用JSON序列化半結構化數據。

JSON是一種輕量級的數據交換格式,是基于JavaScript Programming Language,Standard ECMA-262 3rd Edition-December 1999的一個子集。它易于機器解析和生成,因而用于在不同的編程語言之間交換數據,比如JavaScript和Java、C#間交互。

JSON主要有兩種結構:對象和數組。

對象:用“{}”括起來的內容,數據結構為{key:value,key:value…}的鍵值對,key為對象屬性,value為對應的屬性值,通過“對象.key”來獲取屬性值,而屬性值的類型可以是數字、字符串、數組或者對象。

數組:用“[]”括起來的內容,數據結構為[“java”,“c#”,“javascript”,“redis”…],通過索引進行取值,字段值的類型同樣可以是數字、字符串、數組或者對象。

將半結構化的數據序列化為JSON字符串的方法是object2json(),具體的序列化過程如下:

object2json():將半結構化數據序列化,轉換成JSON字符串。

輸入:實時更新的半結構化數據A

輸出:JSON字符串S

步驟為:

①while(A更新一次)

②if(A為空)

③S.append(“”);

④else if(A是String、Integer、Boolean、Byte等基本類型)

⑤S.append(“A”);

⑥else if(A是Object[]、List、Map、Set類型數據)

⑦調用類似于S.append(array2json((Object[]) A))的方法進行解析;

⑧else S.append(bean2json)格式化輸出;

⑨return S.toString()

在Redis中,數據發送方先將半結構化數據通過object2json方法進行序列化,轉換成JSON字符串,然后將該JSON字符串作為值寫入特定的鍵中,即以(key,value)的形式寫入Redis。數據接收方通過key取出相應的value-JSON字符串,再將JSON字符串通過fromObject方法轉換成JSONObject,將對原始數據的解析轉換成對JSONObject的解析。

將半結構化的數據序列化為JSON數據,優點是可以支持多種編程語言,并且被序列化的對象可以繼續添加或者刪除成員變量而不用變更object2json方法。但是,被序列化的對象必須要有無參數的構造方法和所有變量的getter和setter方法。數據接收方須知道被序列化的對象的“key”和該對象所有的成員變量,才能完全地解析JSONString。

2)采用Java對象序列化技術序列化半結構化數據。

利用Java對象序列化技術將半結構化數據序列轉化為二進制字符串的方法是:writeObject()和readObject()。

(1)writeObject():由于Java中所有的對象都繼承自Object類,考慮到代碼的可重用性,可以利用父類Object的writeObject方法將所有不同類型的對象轉換成字節數組,具體的序列化過程如下:

輸入:實時更新的半結構化數據A

輸出:字節數組

步驟為:

①while(A更新一次)

②A向上轉型成Object類A';

③從對象流中讀取對象A',寫入內存;

④捕獲內存緩沖區數據A',轉換成字節數組B;

⑤endwhile

⑥returnB

(2)readObject()方法:利用抽象類Object類的readObject方法將字節數組轉化為Object類,具體的反序列化過程如下:

輸入:字節數組

輸出:原始數據A'

步驟為:

①將字節數組B轉化為輸入流B';

②將輸入流中的數據B'輸入對象輸入流B'';

③從流中讀取對象,恢復對象狀態,得到A';

④returnA'

數據發送方通過Java對象序列化技術,先將對象向上轉型成父類Object類,然后通過writeObject()方法將對象序列化成二進制流,數據接收方經由readObject()方法將接收到的二進制流反序列化為抽象類Object類,然后再向下轉型為原始數據類型。

2.3 對敏感數據字段進行加密

一些數據中可能存在敏感字段,比如年齡、性別、電話號碼、密碼等等,圖像也可能涉及機密或隱私,序列化的優點是序列化之后的數據格式比較簡單且統一,可以對其運用DES[10]、AES[11]、RSA[12]、MD5[13]等經典加密算法或者自定義加密算法進行加密。數據發送方將加密后的二進制流寫入Redis,數據接收方需先將接收到的二進制流進行解密,再進行反序列化。即使key值被泄露,value值還需先解密才能被成功的反序列化,對于無密鑰的數據攔截者而言無法獲取原始數據,從而保證了數據的安全。

3 實 驗

3.1 實驗環境

設計了基于流計算平臺Storm的實驗來測試所設計的序列化算法的性能。

Storm是Twitter支持開發的一款分布式的、實時的、主從式大數據流式計算系統[14]。實時性主要體現在其可以處理流數據而非靜態數據,并實時更新計算結果[6],主從架構由一個主節點Nimbus和多個工作節點Supervisor組成。Nimbus負責在集群中分發代碼,分配計算任務給機器,并且監控集群狀態。Supervisor負責監聽分配給它的機器的工作,根據需要啟動或關閉工作進程。

實驗的硬件環境:內存8 GB,CPU為主頻2.7 GHz的i7處理器,1個Nimbus節點、2個Supervisor節點的Storm集群。

軟件環境:Storm0.9.1,JRE1.7,Zookeeper-3.4.6、redis-2.4.5。

操作系統:Centos6.4。

編程語言:Java。

3.2 序列化算法的正確性測試

(1)采用文件流序列化非結構化數據的測試結果。

將需要測試的商品號(1417,2227,3967,7237,8467,10477,10777…)序列化后存入Redis,然后反序列化寫入路徑Pubic/sundujing下的test_items.txt中,如圖2(a)所示,文件內容如圖2(b)所示,與原始數據一致。

圖2 采用文件流序列化非結構化數據

(2)圖數據序列化測試結果。

圖數據序列化的測試情況如圖3所示。對圖3(a)的序列化結果為[B@17ee8b8,反序列化結果為圖3(b)。

圖3 圖數據序列化

(3)半結構化數據序列化測試結果。

半結構化數據的序列化與反序列化以簡單的商品信息ITEM為例,ITEM有商品號item_id、商品所屬類目號cat_id、商品標題分詞后的結果terms這三個屬性。一個簡單的實例item:商品號29、商品所屬類目號155、商品標題分詞為123950,53517,106068,59598,7503,171811,25618,147905。JSON序列化結果為item----{"item_id":"29","cat_id":"155" , "terms":"123950,53517,106068,59598,7503,171811,25618,147905"};Java對象序列化結果為[B@fa3ac1,經過反序列化后,能得到原始數據實例item。

3.3 序列化算法的效率測試

以下通過Redis存取序列化數據的性能來體現序列化算法的效率。采用用戶購買記錄作為數據集,如圖4所示,三個字段分別為用戶id、商品id、用戶購買時間。將用戶id作為key值,將用戶購買的商品id作為value值存入對應的用戶id中,用50萬、100萬、150萬條購買記錄進行測試,Redis測試所需時間如圖5所示。

Redis官方聲明過,Redis在極佳的情況下能達到每秒10萬次讀寫,而在該次實驗中50萬條數據序列化后存入只需40 s,并且隨著需處理的數據條數的增長,時間呈線性增長,不會因此導致內存激增而影響其他線程的執行,由此可以看出Redis存取序列化后的數據的性能很高且穩定。

圖4 測試數據集截圖

圖5 Redis時效測試結果

4 結束語

基于Redis的特點和流式實時計算平臺對半結構化和非結構化數據的處理需求,設計了面向Redis的數據序列化算法,借助文件序列化、圖像序列化、JSON序列化和Java對象序列化技術,解決了Redis無法直接存儲半結構化與非結構化數據的問題,并在流數據處理平臺Storm上通過實驗證明了該算法能有效解決實時計算中半結構化與非結構化數據的存儲和實時讀取問題。

在海量數據實時計算中,無論使用哪種開發語言,使用Redis作為數據庫并采用設計的序列化算法,一方面,當需要被處理的數據很大時,能有效降低系統的內存消耗和網絡傳輸;另一方面,不僅可以利用Redis帶來的高性能讀寫效率,而且可以存儲任何半結構化數據甚至非結構化數據對象而無須重復開發代碼,所設計的序列化算法能高效地解決半結構化和非結構化數據的存儲問題。

[1] 蔡金花.淺析NOSQL及使用[J].電腦知識與技術,2011,7(12):2757-2758.

[2] 宗 平,吳秀娟.基于NoSQL系統的組合索引技術研究[J].計算機技術與發展,2014,24(12):53-56.

[3] 曾泉勻.基于Redis的分布式消息服務的設計與實現[D].北京:北京郵電大學,2014.

[4] 蘇翔宇.Key-Value數據庫及其應用研究[C]//中國職協2013年度優秀科研成果獲獎論文集(下冊).出版地不詳:出版者不詳,2013.

[5] 羅 軍,陳席林,李文生.高效Key-Value持久化緩存系統的實現[J].計算機工程,2014,40(3):33-38.

[6] Anderson Q.Storm real-time processing cookbook[M].Birmingham:Packt Publishing,2013.

[7] 張 濤,黃 強,毛磊雅,等.一個基于JSON的對象序列化算法[J].計算機工程與應用,2007,43(15):98-100.

[8] 袁曉銘,林 安.幾種主流快照技術的分析比較[J].微處理機,2008,29(1):127-130.

[9] Surhone L M,Tennoe M T,Henssonow S F,et al.Object exchange model[M].[s.l.]:Betascript Publishing,2010.

[10] 李少芳.DES算法加密過程的探討[J].計算機與現代化,2006(8):102-104.

[11] 何明星,林 昊.AES算法原理及其實現[J].計算機應用研究,2002,19(12):61-63.

[12] 陳傳波,祝中濤.RSA算法應用及實現細節[J].計算機工程與科學,2006,28(9):13-14.

[13] 張裔智,趙 毅,湯小斌.MD5算法研究[J].計算機科學,2008,35(7):295-297.

[14] 李 浩,羅云彬,王志軍,等.基于分布式流式計算系統的任務處理方法、系統及節點:CN,CN 103763378A[P].2014.

Investigation on Data Serialization Algorithm for Redis

SUN Du-jing,LI Ling-juan

(School of Computer,Nanjing University of Posts and Telecommunications,Nanjing 210003,China)

In order to deal with the problem of storing semi-structured and unstructured data in real-time calculation,a data serialization algorithm for Redis is designed.It takes advantage of Redis which can store key-value data and support full memory operation and uses the technologies of file serialization,image serialization,JSON serialization and Java object serialization.The algorithm can not only solve the problem that the semi-structured and unstructured data cannot be directly stored into Redis,but also enable the deserialization to restore the original data perfectly by keeping a deep copy of the data.In addition,encrypting and decrypting can be added to the serialization process to ensure the security of data.The experimental results on Storm platform show that the proposed algorithm is fast,effective and stable.In the real-time processing of massive data integration,this algorithm with Redis can not only make reading and writing highly efficient,but also store any semi-structured and unstructured data without rewriting code no matter which programming language is employed.

Redis;serialization;semi-structured;unstructured;Storm

2016-06-20

2016-09-22 網絡出版時間:2017-03-07

國家自然科學基金資助項目(61302158,61571238)

孫杜靖(1992-),女,碩士研究生,CCF會員,研究方向為流數據挖掘;李玲娟,教授,CCF會員,研究方向為數據挖掘、信息安全、分布式計算。

http://kns.cnki.net/kcms/detail/61.1450.TP.20170307.0922.086.html

TP391

A

1673-629X(2017)05-0077-05

10.3969/j.issn.1673-629X.2017.05.017

猜你喜歡
數據庫
數據庫
財經(2017年15期)2017-07-03 22:40:49
數據庫
財經(2017年2期)2017-03-10 14:35:35
兩種新的非確定數據庫上的Top-K查詢
數據庫
財經(2016年15期)2016-06-03 07:38:02
數據庫
財經(2016年3期)2016-03-07 07:44:46
數據庫
財經(2016年6期)2016-02-24 07:41:51
數據庫
財經(2015年3期)2015-06-09 17:41:31
數據庫
財經(2014年21期)2014-08-18 01:50:18
數據庫
財經(2014年6期)2014-03-12 08:28:19
數據庫
財經(2013年6期)2013-04-29 17:59:30
主站蜘蛛池模板: 天天色综合4| 成人免费网站在线观看| 免费一极毛片| 国产玖玖玖精品视频| 国产经典免费播放视频| 91成人在线观看视频| 欧美日韩免费在线视频| 2021国产精品自拍| 婷婷亚洲最大| 四虎影视8848永久精品| 国产视频大全| 免费毛片全部不收费的| 久久免费成人| 成人国产一区二区三区| 天天色天天操综合网| 人妖无码第一页| 亚洲欧美色中文字幕| 91精品国产自产在线老师啪l| a网站在线观看| 久操中文在线| 综合色婷婷| 久久综合丝袜日本网| 99无码中文字幕视频| 国产一级二级在线观看| 亚洲三级片在线看| 亚洲精品视频在线观看视频| 亚洲伦理一区二区| 亚洲国产天堂在线观看| 亚洲精品波多野结衣| 久久毛片基地| 色首页AV在线| 久久99这里精品8国产| 91久久偷偷做嫩草影院电| 欧美精品亚洲二区| 久久久久久久久18禁秘| 亚洲综合久久成人AV| 精品伊人久久久大香线蕉欧美 | 欧美日韩精品在线播放| 97青草最新免费精品视频| 99热这里只有免费国产精品| 亚洲福利网址| 国产成人免费| 国产成人在线无码免费视频| 无码乱人伦一区二区亚洲一| 欧美在线观看不卡| 中文字幕在线日本| 日本黄色a视频| a级毛片网| 久久动漫精品| 99久久精品免费视频| 日本免费福利视频| 性色一区| 天天婬欲婬香婬色婬视频播放| 国产极品粉嫩小泬免费看| 亚洲午夜国产精品无卡| 青青青亚洲精品国产| 亚洲AV无码久久精品色欲| 18禁高潮出水呻吟娇喘蜜芽| 欧美日韩理论| 日本尹人综合香蕉在线观看| 扒开粉嫩的小缝隙喷白浆视频| 亚洲精品综合一二三区在线| 中文字幕亚洲精品2页| 人妻精品全国免费视频| 国产亚洲欧美日韩在线观看一区二区 | 日本一区二区不卡视频| 日韩专区欧美| 无码粉嫩虎白一线天在线观看| 四虎成人精品| 欧美日韩北条麻妃一区二区| 欧美日本在线观看| 国产精品99在线观看| 国产视频 第一页| 伊人狠狠丁香婷婷综合色| 色噜噜在线观看| 亚洲日韩欧美在线观看| www.91在线播放| 免费xxxxx在线观看网站| 国产靠逼视频| 最新日韩AV网址在线观看| 亚洲va欧美va国产综合下载| 欧美色视频网站|