本發(fā)明涉及大數(shù)據(jù)存儲(chǔ)技術(shù)領(lǐng)域,尤其是一種基于MongoDB的大數(shù)據(jù)進(jìn)行隊(duì)列或堆棧的高效處理的方法。
背景技術(shù):
隨著計(jì)算機(jī)軟件應(yīng)用程序業(yè)務(wù)的發(fā)展,應(yīng)用程序使用隊(duì)列堆棧的場(chǎng)景越來越多,而且應(yīng)用的數(shù)據(jù)量、并發(fā)量也越來越大;如進(jìn)行證券數(shù)據(jù)的實(shí)時(shí)分析、電子商務(wù)的實(shí)時(shí)交易分析等情況,在單位時(shí)間內(nèi)需進(jìn)行大量的數(shù)據(jù)存儲(chǔ)。對(duì)于一般編程工具提供的自帶程序,由于應(yīng)用程序的運(yùn)行環(huán)境的限制,無法很好地滿足大數(shù)據(jù)量、高并發(fā)的請(qǐng)求;造成應(yīng)用程序在運(yùn)行上的瓶頸。
技術(shù)實(shí)現(xiàn)要素:
本發(fā)明解決的技術(shù)問題在于提供一種基于MongoDB,可用于進(jìn)行大數(shù)據(jù)量、高并發(fā)的隊(duì)列堆棧高效處理的操作方法,可以使在一些大數(shù)據(jù)量、高并發(fā)的應(yīng)用上,解決一般編程工具無法提供的大存儲(chǔ)量、高并發(fā)進(jìn)行隊(duì)列堆棧進(jìn)行操作的問題,可應(yīng)用于證券實(shí)時(shí)分析、大數(shù)據(jù)量并發(fā)電子交易等實(shí)時(shí)性較高的場(chǎng)景。
本發(fā)明解決上述技術(shù)問題的技術(shù)方案是:
所述的方法包括以下幾個(gè)步驟:
步驟1:將MongoDB當(dāng)作一個(gè)高效的數(shù)據(jù)存取空間,搭建一個(gè)獨(dú)立的MongoDB或由多個(gè)MongoDB形成的集群;
步驟2:通過分析進(jìn)行高并發(fā)大數(shù)據(jù)量存取的業(yè)務(wù)邏輯,從需要進(jìn)行隊(duì)列或堆棧操作的數(shù)據(jù)中抽取出進(jìn)行存數(shù)據(jù)與取數(shù)據(jù)的排序順序特征,把相關(guān)的特征配置到系統(tǒng)上;
步驟3:按配置的排序順序特征,在MongoDB上建立起索引支持,用于快速的數(shù)據(jù)排序查詢;如沒有指定排序順序,可建立一個(gè)自增的特征,用于快速的數(shù)據(jù)排序查詢;
步驟4:通過配置的排序順序特征已建立的相關(guān)索引,并調(diào)用MongoDB的查詢接口,分別實(shí)現(xiàn)隊(duì)列堆棧的增加PUSH、獲取POP、統(tǒng)計(jì)COUNT等操作方法,并提供線程安全的調(diào)用接口。
所述的搭建MongoDB是在應(yīng)用程序另外的服務(wù)器上搭建MongoDB,用于數(shù)據(jù)的高速并發(fā)的存儲(chǔ);當(dāng)數(shù)據(jù)高速并發(fā)存儲(chǔ)要求不斷增加時(shí),搭建集群的MongoDB。
對(duì)于時(shí)間順序特征比較明顯的,可按存儲(chǔ)的時(shí)間順序,按毫秒級(jí)別甚至微秒的級(jí)別進(jìn)行排序,選擇為順序排序的特征;對(duì)于無時(shí)間特征的,選擇相對(duì)散列值比較高的特征進(jìn)行排序;
對(duì)于無明顯的順序排序特征的,通過建立一個(gè)自增的特征,并調(diào)用MongoDB自帶的自增方法,在每次存儲(chǔ)數(shù)據(jù)時(shí)自動(dòng)獲取增量的值,最終按存儲(chǔ)的順序作為排序特征;
如果選取的單個(gè)特征無法很明顯地進(jìn)行順序排序,通過選擇多個(gè)特征的方法,原則上盡量選擇少的特征,以免影響后續(xù)的數(shù)據(jù)存取效率。
所述的在MongoDB上建立順序排序索引是:
對(duì)于單獨(dú)的MongoDB,使用單一的索引來建立順序排序索引;
對(duì)于集群的MongoDB,使用兩個(gè)的組合索引來建立順序排序索引;包括使用“固定值+增量值”兩字段做組合索引,使數(shù)據(jù)在多個(gè)MongoDB實(shí)例之間是分散寫入,在實(shí)例內(nèi)部是順序?qū)懭耄?/p>
對(duì)順序排序索引的建立語句進(jìn)行保存,用于后續(xù)進(jìn)行新采集Collection建立時(shí)的使用。
所述實(shí)現(xiàn)隊(duì)列堆棧的COUNT操作方法是調(diào)用MongoDB的count方法,實(shí)現(xiàn)數(shù)據(jù)總數(shù)的統(tǒng)計(jì),進(jìn)行統(tǒng)計(jì)時(shí)進(jìn)行數(shù)據(jù)存取的同步鎖操作,確保數(shù)據(jù)的準(zhǔn)確性;
所述實(shí)現(xiàn)隊(duì)列堆棧的PUSH操作方法是:
主要使用MongoDB的批量插入BatchInsert方法,進(jìn)行數(shù)據(jù)的增加操作,把數(shù)據(jù)批量按順序放到存儲(chǔ)空間上;
增加數(shù)據(jù)的PUSH過程,確保與COUNT方法進(jìn)行同步鎖的操作,以保證獲取數(shù)據(jù)統(tǒng)計(jì)的準(zhǔn)確性;
對(duì)于堆棧的PUSH過程,與POP進(jìn)行同步鎖的操作,以確保數(shù)據(jù)后進(jìn)先出;
所述實(shí)現(xiàn)隊(duì)列堆棧的POP操作方法是:
主要操作是進(jìn)行數(shù)據(jù)的獲取操作,并對(duì)已經(jīng)獲取了的操作從存儲(chǔ)空間上進(jìn)行刪除;查詢的操作使用MongoDB的查詢Find方法;獲取了數(shù)據(jù)后,使用MongoDB的批量刪除BatchDelete方法把獲取后的數(shù)據(jù)進(jìn)行刪除;
獲取數(shù)據(jù)的POP過程,確保與COUNT方法進(jìn)行同步鎖的操作,以保證獲取數(shù)據(jù)統(tǒng)計(jì)的準(zhǔn)確性;
隊(duì)列的Find方法按分類Sort方法進(jìn)行排序時(shí),按建立的順序排序索引按正序進(jìn)行獲取數(shù)據(jù);
對(duì)于堆棧的POP過程,與PUSH進(jìn)行同步鎖的操作,以確保數(shù)據(jù)后進(jìn)先出;堆棧的Find方法按Sort方法進(jìn)行排序時(shí),按建立的順序排序索引,按倒序進(jìn)行獲取數(shù)據(jù)。
在進(jìn)行同步鎖的操作過程,以時(shí)間為準(zhǔn),哪個(gè)操作首先獲取到同步鎖,就進(jìn)行相關(guān)的操作,操作完成后即刻進(jìn)行同步鎖釋放,用于后續(xù)的操作。
本發(fā)明的有益效果是:
本發(fā)明方法通過利用MongonDB的高效存儲(chǔ)及豐富的查詢支持、較多類型的索引支持以及自動(dòng)分片Auto-Sharding的功能,把MongoDB當(dāng)作一個(gè)高效的數(shù)據(jù)存取空間,通過配置相關(guān)的計(jì)數(shù)器順序特征,并實(shí)現(xiàn)隊(duì)列或堆棧在操作過程中的POP與PUSH方法,從而解決在應(yīng)用中大批量的數(shù)據(jù)進(jìn)行隊(duì)列或堆棧的操作時(shí),由于運(yùn)行環(huán)境的空間不足、維護(hù)新空間的增加導(dǎo)致效率不高的問題。通過這種方法,使高并發(fā)、大數(shù)據(jù)量的應(yīng)用在進(jìn)行隊(duì)列或堆棧操作時(shí),可以實(shí)現(xiàn)數(shù)據(jù)的高效存儲(chǔ),并可以實(shí)現(xiàn)均衡負(fù)載,把對(duì)數(shù)據(jù)存取操作,轉(zhuǎn)換到MongoDBh,從而極大提高了大數(shù)據(jù)量隊(duì)列堆棧操作的效率。
本發(fā)明方法通過基于MongoDB作為存儲(chǔ)介質(zhì),利用MongoDB面向文檔型非關(guān)系數(shù)據(jù)庫、基于內(nèi)存操作,具體速度快、操作方便等特點(diǎn),并可低擴(kuò)展難度的優(yōu)點(diǎn),適合后大數(shù)據(jù)量高并發(fā)的數(shù)據(jù)存取操作,通過對(duì)MongoDB進(jìn)行數(shù)據(jù)操作線程安全的控制,實(shí)現(xiàn)進(jìn)行大數(shù)據(jù)量高并發(fā)的數(shù)據(jù)存儲(chǔ),解決應(yīng)用過程中特定的數(shù)據(jù)處理問題。
附圖說明
下面結(jié)合附圖對(duì)本發(fā)明進(jìn)一步說明:
附圖1是本發(fā)明計(jì)算機(jī)軟件系統(tǒng)功能組件化的流程圖。
具體實(shí)施方式
如圖1所示,本發(fā)明的方法實(shí)施步驟如下:
步驟1:在與應(yīng)用程序同個(gè)服務(wù)器或另外獨(dú)立的服務(wù)器上,搭建一個(gè)獨(dú)立的MongoDB或由多個(gè)MongoDB形成的集群,用于數(shù)據(jù)的存取操作;
步驟2:通過分析進(jìn)行高并發(fā)大數(shù)據(jù)量存取的業(yè)務(wù)邏輯,對(duì)需要進(jìn)行隊(duì)列或堆棧操作的數(shù)據(jù)中抽取出進(jìn)行存數(shù)據(jù)與取數(shù)據(jù)的排序順序特征,把相關(guān)的特征配置到系統(tǒng)上;
步驟3:按配置的排序順序特征,在MongoDB上建立起索引支持,用于快速的數(shù)據(jù)排序查詢;如沒有指定排序順序,可通過建立一個(gè)自增的特征,用于快速的數(shù)據(jù)排序查詢;
步驟4:通過程序?qū)崿F(xiàn)類似于隊(duì)列堆棧的操作的接口程序,實(shí)現(xiàn)PUSH、POP、COUNT等線程安全的方法,接收數(shù)據(jù)的存取命令,并把命令轉(zhuǎn)換為調(diào)用MongoDB的相關(guān)方法,把數(shù)據(jù)的存取操作通過MongoDB實(shí)現(xiàn);
步驟5:把實(shí)現(xiàn)的類似于隊(duì)列堆棧的接口程序,部署到應(yīng)用服務(wù)器上,用于應(yīng)用程序的隊(duì)列堆棧數(shù)據(jù)存取調(diào)用,從而實(shí)現(xiàn)支持大數(shù)據(jù)量高并發(fā)的隊(duì)列堆棧高效操作。
所述搭建MongoDB具體步驟為:
步驟一、可在應(yīng)用程序另外的服務(wù)器上搭建MongoDB,用于數(shù)據(jù)的高速并發(fā)的存儲(chǔ),從而降低應(yīng)用程序所在服務(wù)器的資源壓力;
步驟二、在數(shù)據(jù)高速并發(fā)存儲(chǔ)要求不斷增加的情況下,可通過搭建集群的MongoDB來應(yīng)對(duì),從而無需修改應(yīng)用程序,就能達(dá)到降低服務(wù)器的資源壓力,做到資源均衡負(fù)載;
步驟三、通過獨(dú)立的應(yīng)用服務(wù)器上搭建MongoDB或集群,要求服務(wù)器與應(yīng)用服務(wù)器的網(wǎng)絡(luò)達(dá)到100M或者更高的標(biāo)準(zhǔn),從而使數(shù)據(jù)的存取過程的通訊鏈路不成為瓶頸。
所述分析高并發(fā)大數(shù)據(jù)量業(yè)務(wù)邏輯,抽取順序排序特征的具體步驟為:
步驟一、不同的業(yè)務(wù)邏輯,對(duì)隊(duì)列堆棧進(jìn)行操作時(shí)的排序順序特征不相同,所以在應(yīng)用前需進(jìn)行排序順序特征的分析;
步驟二、對(duì)于時(shí)間順序特征比較明顯的,可按存儲(chǔ)的時(shí)間順序,按毫秒級(jí)別甚至微秒的級(jí)別進(jìn)行排序,選擇為順序排序的特征;對(duì)于無時(shí)間特征的,選擇相對(duì)散列值比較高的特征進(jìn)行排序;
步驟三、對(duì)于無明顯的順序排序特征的,可通過建立一個(gè)自增的特征,并調(diào)用MongoDB自帶的自增方法,在每次存儲(chǔ)數(shù)據(jù)時(shí)自動(dòng)獲取增量的值,最終按存儲(chǔ)的順序作為排序特征;
步驟四、如果選取的單個(gè)特征無法很明顯地進(jìn)行順序排序,可通過選擇多個(gè)特征的方法,只是原則上盡量選擇少的特征,以免影響后續(xù)的數(shù)據(jù)存取效率。
所述在MongoDB上建立順序排序索引的具體步驟為:
步驟一、對(duì)于單獨(dú)的MongoDB,盡量使用單一的索引來建立順序排序索引,盡量使在數(shù)據(jù)進(jìn)行寫入時(shí)提交效率;
步驟二、對(duì)于集群的MongoDB,可使用兩個(gè)的組合索引來提高順序排列的效率,例如使用“固定值+增量值”兩字段做組合索引,使數(shù)據(jù)在多個(gè)MongoDB實(shí)例之間是分散寫入,在實(shí)例內(nèi)部是順序?qū)懭耄?/p>
步驟三、順序排序索引的建立語句需進(jìn)行保存,以用于后續(xù)進(jìn)行新Collection建立時(shí)的使用。
所述實(shí)現(xiàn)隊(duì)列堆棧的COUNT操作方法的具體為:調(diào)用MongoDB的count方法,實(shí)現(xiàn)數(shù)據(jù)總數(shù)的統(tǒng)計(jì),進(jìn)行統(tǒng)計(jì)時(shí)需進(jìn)行數(shù)據(jù)存取的同步鎖操作,以確保數(shù)據(jù)的準(zhǔn)確性。
所述實(shí)現(xiàn)隊(duì)列堆棧的PUSH操作方法的具體步驟為:
步驟一、隊(duì)列堆棧的PUSH方法,主要操作是進(jìn)行數(shù)據(jù)的增加操作,通過PUSH方法,把數(shù)據(jù)批量批順序放到存儲(chǔ)空間上,主要使用到MongoDB的BatchInsert方法;
步驟二、增加的數(shù)據(jù)的PUSH過程,需確保與COUNT方法的同步鎖操作,以保證獲取數(shù)據(jù)統(tǒng)計(jì)的準(zhǔn)確性;
步驟三、對(duì)于隊(duì)列的PUSH過程,由于隊(duì)列的特點(diǎn)是先進(jìn)先出,所以在PUSH的過程,與POP獲取數(shù)據(jù)無沖突,無需與POP進(jìn)行同步鎖的操作;
步驟四、對(duì)于堆棧的PUSH過程,由于堆棧的特點(diǎn)是后進(jìn)先出,所以在PUSH的過程,與POP獲取數(shù)據(jù)有沖突,需與POP進(jìn)行同步鎖的操作,以確保數(shù)據(jù)后進(jìn)先出。
所述實(shí)現(xiàn)隊(duì)列堆棧的POP操作方法的具體步驟為:
步驟一、隊(duì)列堆棧的POP方法,主要操作是進(jìn)行數(shù)據(jù)的獲取操作,并對(duì)已經(jīng)獲取了的操作從存儲(chǔ)空間上進(jìn)行刪除,查詢的操作使用MongoDB的Find方法;獲取了數(shù)據(jù)后,使用MongoDB的BatchDelete方法把獲取后的數(shù)據(jù)進(jìn)行刪除;
步驟二、獲取數(shù)據(jù)的POP過程,需確保與COUNT方法的同步鎖操作,以保證獲取數(shù)據(jù)統(tǒng)計(jì)的準(zhǔn)確性;
步驟三、對(duì)于隊(duì)列的POP過程,由于隊(duì)列的特點(diǎn)是先進(jìn)先出,所以在POP的過程,與PUSH增加數(shù)據(jù)無沖突,無需與PUSH進(jìn)行同步鎖的操作;隊(duì)列的Find方法按Sort方法進(jìn)行排序時(shí),按建立的順序排序索引按正序進(jìn)行獲取數(shù)據(jù);
步驟四、對(duì)于堆棧的POP過程,由于堆棧的特點(diǎn)是后進(jìn)先出,所以在PUSH的過程,與PUSH增加數(shù)據(jù)有沖突,需與PUSH進(jìn)行同步鎖的操作,以確保數(shù)據(jù)后進(jìn)先出;堆棧的Find方法按Sort方法進(jìn)行排序時(shí),按建立的順序排序索引按倒序進(jìn)行獲取數(shù)據(jù)。
在進(jìn)行同步鎖的操作過程,以時(shí)間為準(zhǔn),哪個(gè)操作首先獲取到同步鎖,就進(jìn)行相關(guān)的操作,操作完成后即刻進(jìn)行同步鎖釋放,用于后續(xù)的操作。
基于MongoDB的高效存儲(chǔ)數(shù)據(jù)的特點(diǎn),存儲(chǔ)引擎使用的內(nèi)存映射文件(MMAP的方式),將內(nèi)存管理工作交給操作系統(tǒng)去處理,并提供了高效的數(shù)據(jù)存取方法,從而提供了一種按隊(duì)列堆棧進(jìn)行數(shù)據(jù)存取的方法,解決一般隊(duì)列堆棧存儲(chǔ)空間小的問題。
本發(fā)明涉及的MongoDB是一個(gè)基于分布式文件存儲(chǔ)的數(shù)據(jù)庫。由C++語言編寫。旨在為WEB應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲(chǔ)解決方案。MongoDB是一個(gè)介于關(guān)系數(shù)據(jù)庫和非關(guān)系數(shù)據(jù)庫之間的產(chǎn)品,是非關(guān)系數(shù)據(jù)庫當(dāng)中功能最豐富,最像關(guān)系數(shù)據(jù)庫的。他支持的數(shù)據(jù)結(jié)構(gòu)非常松散,是類似json的bson格式,因此可以存儲(chǔ)比較復(fù)雜的數(shù)據(jù)類型。Mongo最大的特點(diǎn)是他支持的查詢語言非常強(qiáng)大,其語法有點(diǎn)類似于面向?qū)ο蟮牟樵冋Z言,幾乎可以實(shí)現(xiàn)類似關(guān)系數(shù)據(jù)庫單表查詢的絕大部分功能,而且還支持對(duì)數(shù)據(jù)建立索引。