金晉,楊明,金華
(1.中國(guó)人民公安大學(xué)警務(wù)實(shí)戰(zhàn)訓(xùn)練部,北京 100038;2.中國(guó)人民公安大學(xué)網(wǎng)絡(luò)安全保衛(wèi)學(xué)院,北京 100038; 3.中國(guó)人民公安大學(xué)警務(wù)信息工程學(xué)院,北京 100038)
一種基于分區(qū)緩存的海量數(shù)據(jù)檢索方法
金晉1,楊明2,金華3
(1.中國(guó)人民公安大學(xué)警務(wù)實(shí)戰(zhàn)訓(xùn)練部,北京 100038;2.中國(guó)人民公安大學(xué)網(wǎng)絡(luò)安全保衛(wèi)學(xué)院,北京 100038; 3.中國(guó)人民公安大學(xué)警務(wù)信息工程學(xué)院,北京 100038)
針對(duì)交通綜合應(yīng)用系統(tǒng)中車輛數(shù)據(jù)的采集頻率高、匯集速度快的特點(diǎn),提出一種海量數(shù)據(jù)的分區(qū)緩存檢索方法。該方法采用分區(qū)表技術(shù),通過并發(fā)檢索和緩存機(jī)制,實(shí)現(xiàn)了海量數(shù)據(jù)的快速檢索。通過試驗(yàn)分析,該方法可以有效提高車輛數(shù)據(jù)的檢索速度。
海量數(shù)據(jù);分區(qū)表;緩存;檢索
為加強(qiáng)科技強(qiáng)警建設(shè),全國(guó)各地啟動(dòng)了交通綜合應(yīng)用系統(tǒng)建設(shè)項(xiàng)目,通過在一定范圍內(nèi)布設(shè)一定數(shù)量的監(jiān)控點(diǎn),利用車輛信息采集技術(shù)實(shí)時(shí)監(jiān)控各路段或路口的機(jī)動(dòng)車通行情況,并將各監(jiān)控點(diǎn)采集的車牌及圖片等基礎(chǔ)數(shù)據(jù)實(shí)時(shí)傳送至中心信息系統(tǒng),對(duì)其進(jìn)行存儲(chǔ)、計(jì)算、比對(duì)等處理,實(shí)現(xiàn)了對(duì)過往車輛、嫌疑車輛和違法車輛的實(shí)時(shí)查控,為公安各警種快速有效地打擊涉車違法行為提供了強(qiáng)有力的技術(shù)手段,真正實(shí)現(xiàn)了科技強(qiáng)警的目標(biāo)。
由此,中心信息系統(tǒng)快速有效的處理車輛數(shù)據(jù),將有助于提高交通安全執(zhí)法的時(shí)效性和防控的有效性。而車輛數(shù)據(jù)具有采集頻率高、上傳實(shí)時(shí)性強(qiáng)、數(shù)據(jù)量增長(zhǎng)快等特點(diǎn),很快從數(shù)量和容量上累積為海量數(shù)據(jù)[1]。
針對(duì)海量數(shù)據(jù),在應(yīng)用層面可通過多種途徑和方法對(duì)數(shù)據(jù)存儲(chǔ)和檢索進(jìn)行優(yōu)化。本文針對(duì)車輛信息這一典型海量數(shù)據(jù),提出了一種分區(qū)存儲(chǔ)和基于緩存機(jī)制的并發(fā)檢索方法。
車輛信息具有采集頻率高、攜帶信息豐富、上傳實(shí)時(shí)性強(qiáng)、修改刪除較少等特點(diǎn),隨著時(shí)間的推移,其數(shù)據(jù)量迅速增長(zhǎng),可謂海量數(shù)據(jù)。
本文對(duì)車輛信息的存儲(chǔ)和檢索進(jìn)行了優(yōu)化。對(duì)于存儲(chǔ),采用分區(qū)[2]技術(shù),對(duì)超大表進(jìn)行分區(qū),實(shí)現(xiàn)了邏輯上的分布式存儲(chǔ)。對(duì)于檢索,采取分區(qū)并發(fā)檢索的方式,即使用多線程并發(fā)方式檢索分區(qū)表,而非主表;采用緩存機(jī)制,記錄每個(gè)用戶的查詢結(jié)果,以減少后續(xù)檢索時(shí)間。
1.1 基于分區(qū)表的存儲(chǔ)策略
將采集的車輛信息以結(jié)構(gòu)化數(shù)據(jù)存儲(chǔ)于關(guān)系型數(shù)據(jù)庫(kù)中,數(shù)據(jù)庫(kù)表為VehicleInfo。隨著時(shí)間的推移,車輛信息將迅速增長(zhǎng),VehicleInfo表逐漸生成為超大表。對(duì)于超大表的增加、刪除、查詢、修改操作,即使對(duì)條件等進(jìn)行限制,均要對(duì)全表進(jìn)行操作,如果數(shù)據(jù)量巨大,如幾千萬(wàn)條、甚至上億條數(shù)據(jù),則進(jìn)行全表操作將會(huì)對(duì)數(shù)據(jù)庫(kù)性能造成嚴(yán)重影響。因此對(duì)這種超大表可采用分區(qū)表技術(shù),以提高性能。分區(qū)表是按照特定方式邏輯劃分大表,最終將其數(shù)據(jù)部署到多個(gè)相對(duì)較小的分區(qū)段中。當(dāng)執(zhí)行SQL語(yǔ)句訪問分區(qū)表時(shí),服務(wù)器進(jìn)程可以直接訪問某個(gè)或某幾個(gè)分區(qū)段,而不需要訪問整張大表的全部數(shù)據(jù),從而提高性能[3]。
車輛信息表VehicleInfo中的主要字段有:監(jiān)控點(diǎn)編碼deviceID、車牌號(hào)碼vehiclePlate、經(jīng)過時(shí)間passTime、號(hào)牌顏色plateColour、號(hào)牌種類plateType、行駛狀態(tài)runState、車身顏色vehicleColour等。其中,deviceID、vehiclePlate、passTime 3個(gè)維度的信息是車輛檢索時(shí)用戶較多關(guān)注的幾個(gè)信息,選擇pass-Time作為分區(qū)字段,以天作為分區(qū)邊界,能較好地控制每個(gè)分區(qū)的數(shù)據(jù)量。分區(qū)表的結(jié)構(gòu)與主表VehicleInfo一樣,命名為VehicleInfoyyyyMMdd,它由兩部分組成,主表名VehicleInfo+yyyyMMdd(年月日)。另外,選擇deviceID、vehiclePlate這兩列創(chuàng)建復(fù)合索引,可加快數(shù)據(jù)的檢索速度。
分區(qū)表的建立,雖然從物理上對(duì)車輛數(shù)據(jù)進(jìn)行了分離,但從邏輯結(jié)構(gòu)上仍然屬于一個(gè)整體,看不出有什么變化,這樣便于制定靈活的檢索方案。
1.2 基于分區(qū)緩存機(jī)制的檢索策略
模型中的user、cache、PT分別表示用戶、緩存和分區(qū)表。當(dāng)用戶發(fā)起檢索指令時(shí),服務(wù)器將在內(nèi)存中為該用戶創(chuàng)建哈希表結(jié)構(gòu),用于緩存其此次查詢的車輛數(shù)據(jù),然后采用多線程并發(fā)查詢的方式從多個(gè)數(shù)據(jù)庫(kù)分區(qū)表中獲取結(jié)果,將查詢結(jié)果更新于該用戶相應(yīng)分區(qū)表數(shù)據(jù)的緩存中,用于返回結(jié)果。
圖1 基于緩存機(jī)制的分區(qū)檢索數(shù)據(jù)的模型
1.2.1 緩存中的哈希表結(jié)構(gòu)
緩存中的哈希表結(jié)構(gòu)[4],能夠保證每個(gè)用戶只有一份緩存數(shù)據(jù)。
Map〈String,Set〈VehicleDataCache〉〉中的鍵為用戶ID、值為分區(qū)表結(jié)果集(VehicleDataCache)列表,它在緩存中維護(hù)用戶的查詢結(jié)果集。
每個(gè)VehicleDataCache結(jié)果集中的含義如下:
partitionTableName:分區(qū)表名稱,用于標(biāo)識(shí)記錄的是哪個(gè)分區(qū)表返回的結(jié)果集;
curResultList:緩存部分結(jié)果,記錄返回結(jié)果列表;
totalNum:總共數(shù)量,該分區(qū)表中滿足條件的車輛信息總數(shù);
curBPos:當(dāng)前結(jié)果在表數(shù)據(jù)結(jié)果集中的起始位置,與curEPos結(jié)合使用,用于計(jì)算分頁(yè)處的結(jié)果位置;
curEPos:當(dāng)前結(jié)果在表數(shù)據(jù)結(jié)果集中的終止位置;
cacheMaxNum:設(shè)置緩存最大數(shù)據(jù),該數(shù)據(jù)可根據(jù)服務(wù)器的內(nèi)存大小、用戶并發(fā)數(shù)以及查詢響應(yīng)時(shí)間等因素進(jìn)行預(yù)先設(shè)置。
flag:是否查詢完畢,標(biāo)識(shí)當(dāng)前分區(qū)表的查詢結(jié)果集是否已經(jīng)返回。
這些屬性信息,將用于計(jì)算檢索和返回的策略。1.2.2方法描述
判斷檢索方式,如果是用戶的首次查詢,則執(zhí)行首次查詢流程;如果是用戶的后續(xù)分頁(yè)查詢,則執(zhí)行分頁(yè)查詢流程。
首次查詢:
(1)根據(jù)用戶ID查詢緩存中是否有該用戶上次查詢的車輛數(shù)據(jù),如果有,則清除;
(2)查看是否有上次未停止的查詢線程,如果有,則停止;
(3)在緩存中創(chuàng)建哈希表,建立用戶和每個(gè)分區(qū)表返回查詢結(jié)果集等信息的映射關(guān)系;
(4)根據(jù)查詢條件中的開始時(shí)間、結(jié)束時(shí)間和分區(qū)表間隔時(shí)間,獲得將要查詢的分區(qū)表,將獲得的分區(qū)表名放入查詢列表;
圖2 緩存中的哈希表結(jié)構(gòu)
(5)對(duì)查詢列表中的分區(qū)表執(zhí)行多線程查詢?nèi)蝿?wù):從數(shù)據(jù)庫(kù)分區(qū)表中獲取指定條件指定數(shù)量的車輛信息;
(6)獲得分區(qū)表的查詢結(jié)果,更新緩存中的車輛數(shù)據(jù),更改緩存標(biāo)識(shí);
(7)等待第一個(gè)分區(qū)表查詢完成后,如果結(jié)果滿足第一頁(yè)的數(shù)據(jù)量,則直接返回,如果不滿足,則繼續(xù)等待第二個(gè)分區(qū)表,以此類推;
(8)當(dāng)首頁(yè)結(jié)果返回后,獲取后續(xù)分區(qū)表查詢結(jié)果的線程仍在執(zhí)行,直到獲取所有分區(qū)表的查詢結(jié)果。
示例:user1檢索2013年9月1日~2013年9月15日的車輛信息,系統(tǒng)的處理策略:
(1)根據(jù)開始時(shí)間2013年9月1日、結(jié)束時(shí)間2013年9月15日和分區(qū)表間隔,獲得即將檢索的分區(qū)表:VehicleInfo20130915、VehicleInfo20130914、……、VehicleInfo20130902、VehicleInfo20130901,共16張分區(qū)表。
(2)在內(nèi)存的哈希表結(jié)構(gòu)中創(chuàng)建基于user1的車輛信息緩存數(shù)據(jù),即Map<String,Set<Vehicle-DataCache>>結(jié)構(gòu)中放入鍵為user1、值為16個(gè)記錄分區(qū)表結(jié)果集列表的映射關(guān)系。
(3)對(duì)每個(gè)分區(qū)表,采取多線程并發(fā)檢索方式,從數(shù)據(jù)庫(kù)表中獲取指定條件、一定數(shù)量的車輛信息。
(4)將從每個(gè)分區(qū)表中檢索回的數(shù)據(jù)分別放入分區(qū)表結(jié)果集,供后續(xù)翻頁(yè)使用。
(5)當(dāng)分區(qū)表中的數(shù)據(jù)不滿足當(dāng)前分頁(yè)條件時(shí),則會(huì)根據(jù)VehicleDataCache緩存結(jié)構(gòu)中的屬性信息,決定檢索和返回結(jié)果的策略。
分頁(yè)查詢:
(1)根據(jù)用戶ID查詢緩存中是否有該用戶查詢的車輛數(shù)據(jù),如果有,則繼續(xù);
(2)根據(jù)查詢頁(yè)數(shù)和每頁(yè)顯示數(shù)量,計(jì)算從哪些分區(qū)表獲取數(shù)據(jù);
(3)根據(jù)計(jì)算結(jié)果,從緩存中獲取指定分區(qū)表的車輛數(shù)據(jù);
(4)如果當(dāng)前緩存分區(qū)表的結(jié)果集滿足分頁(yè)條件,則直接返回;否則根據(jù)當(dāng)前分區(qū)表中剩余緩存數(shù)據(jù)與結(jié)果總數(shù)的關(guān)系,計(jì)算是需要繼續(xù)從數(shù)據(jù)庫(kù)中查詢?cè)摲謪^(qū)表,還是從下一個(gè)分區(qū)表中獲取數(shù)據(jù),以此類推。
以應(yīng)用系統(tǒng)匯集的車輛數(shù)據(jù)量作為參考,對(duì)基于緩存機(jī)制的分區(qū)并發(fā)檢索數(shù)據(jù)的方法進(jìn)行驗(yàn)證,并與傳統(tǒng)檢索方式進(jìn)行對(duì)比。
以總量為2 000萬(wàn)條車輛信息的數(shù)據(jù)為例,實(shí)驗(yàn)結(jié)果如下:
圖32 000萬(wàn)條數(shù)據(jù)檢索時(shí)間對(duì)比
圖中的橫坐標(biāo)為顯示頁(yè)數(shù),縱坐標(biāo)為檢索時(shí)長(zhǎng)。從實(shí)驗(yàn)結(jié)果可以看出,在翻頁(yè)時(shí),如果從緩存中獲取結(jié)果,則本文的檢索方法耗時(shí)一般小于100 ms,而傳統(tǒng)檢索方法的耗時(shí)在7 000 ms左右;而當(dāng)緩存結(jié)果集不滿足返回結(jié)果時(shí),則本文檢索方法也比傳統(tǒng)檢索方法的性能提升了一倍。
本文針對(duì)車輛信息這一典型海量數(shù)據(jù),給出了一種分區(qū)存儲(chǔ)和基于緩存機(jī)制并發(fā)檢索方法。該方法建立在分布式存儲(chǔ)基礎(chǔ)之上,對(duì)數(shù)據(jù)進(jìn)行并發(fā)檢索,并將部分檢索結(jié)果集存放于緩存中,實(shí)現(xiàn)了海量數(shù)據(jù)的快速檢索。通過實(shí)驗(yàn)比對(duì)分析,該方法可以有效提高車輛數(shù)據(jù)的檢索速度。
[1]毛杰.海量數(shù)據(jù)庫(kù)查詢優(yōu)化研究[J].軟件導(dǎo)刊,2010 (5):184-186.
[2]Christian Antognini.Oracle性能診斷藝術(shù)[M].童家旺,等,譯.北京:人民郵電出版社,2009.
[3]陳俊.分區(qū)表及物化視圖技術(shù)在查詢分析中的應(yīng)用[D].武漢:湖北大學(xué),2010.
[4]胥攀,劉勝利.一種改進(jìn)的分段哈希算法[J].計(jì)算機(jī)工程,2014(5):17.
(責(zé)任編輯 陳小明)
TP31
北京市支持中央高校共建項(xiàng)目-青年英才計(jì)劃(YEPT1367)資助。
金晉(1974—),女,吉林長(zhǎng)春市人,講師。研究方向?yàn)橛?jì)算機(jī)應(yīng)用。