本發(fā)明涉及數(shù)據(jù)處理領(lǐng)域,具體而言,涉及一種文件存儲方法及裝置。
背景技術(shù):
隨著短信業(yè)務的快速發(fā)展,公司業(yè)務發(fā)展也從單機模式發(fā)展為集群模式,用于提高業(yè)務接口速度,然而采用上述方式導致數(shù)據(jù)庫瓶頸越來越明顯,進而又引入了高速緩存機制緩解數(shù)據(jù)庫的壓力??墒怯捎跇I(yè)務存在短時峰值的問題會引起高速讀寫進而導致緩存持久化頻繁,對業(yè)務峰值時的處理效率產(chǎn)生很大影響,如果采用關(guān)閉持久化的方式又可能會引起故障數(shù)據(jù)的恢復問題。
針對上述問題,相關(guān)技術(shù)中采用將緩存中的數(shù)據(jù)序列化為小文件的方式進行數(shù)據(jù)緩存和故障數(shù)據(jù)恢復,并且在接口程序設定數(shù)量閾值及時間閾值,在緩存中的數(shù)據(jù)的任何一項達到閾值時,將緩存中的內(nèi)容提取并序列化后存入一個小文件中,然后由其他線程根據(jù)目錄中的文件記錄,將文件數(shù)據(jù)的異步處理入庫,通過該方式可以成功的將數(shù)據(jù)庫的訪問壓力降低三至四個數(shù)量級,但是會產(chǎn)生是文件系統(tǒng)的索引文件暴增的問題。在實際工作中,也曾出現(xiàn)過系統(tǒng)的索引文件耗盡的情況,從而導致了文件緩存目錄的訪問時間開銷過大。對于該問題,公司采取縮短數(shù)據(jù)備份刪除任務的周期,但是有時數(shù)據(jù)備份刪除任務耗時較長,而且硬盤故障率也一直居高不下。
針對上述相關(guān)技術(shù)中文件存儲的性能較低的問題,目前尚未提出有效的解決方案。
技術(shù)實現(xiàn)要素:
本發(fā)明實施例提供了一種文件存儲方法及裝置,以至少解決相關(guān)技術(shù)中文件存儲的性能較低的技術(shù)問題。
根據(jù)本發(fā)明實施例的一個方面,提供了一種文件存儲方法,包括:從緩存中獲取預定數(shù)量的數(shù)據(jù);將獲取到的所述數(shù)據(jù)根據(jù)第一文件存儲結(jié)構(gòu)寫入第一文件中;將所述第一文件根據(jù)所述第二文件存儲結(jié)構(gòu)寫入到第二文件中,其中,所述第二文件能夠?qū)懭攵鄠€所述第一文件;將所述第二文件進行存儲。
進一步地,將所述第一文件根據(jù)所述第二文件存儲結(jié)構(gòu)寫入到所述第二文件中包括:獲取所述第二文件存儲結(jié)構(gòu)中的寫入位置數(shù)值,其中,所述寫入位置數(shù)值用于所述第二文件中能夠?qū)懭胨龅谝晃募钠鹗嘉恢茫桓鶕?jù)所述第一文件的大小從所述寫入位置數(shù)值鎖定用于存儲所述第一文件的數(shù)據(jù)長度區(qū)域;在鎖定成功后,將所述第一文件寫入到所述數(shù)據(jù)長度區(qū)域;在寫入成功后,進行鎖定釋放并且更新所述寫入位置數(shù)值。
進一步地,還包括:在鎖定失敗之后,等待預定時長后,重新根據(jù)所述第一文件的大小從所述寫入位置數(shù)值鎖定用于存儲所述第一文件的數(shù)據(jù)長度區(qū)域。
進一步地,將所述第二文件進行存儲之后,所述方法還包括:獲取所述第二文件;根據(jù)所述第二文件存儲結(jié)構(gòu)中的讀取位置數(shù)值讀取所述第一文件存儲結(jié)構(gòu),其中,所述第一文件存儲中結(jié)構(gòu)中至少包括所述第一文件的文件長度,所述第二文件包括多個所述第一文件;根據(jù)所述第一文件的文件長度從所述第二文件中讀取所述第一文件。
進一步地,在根據(jù)所述第二文件存儲結(jié)構(gòu)中的讀取位置數(shù)值讀取所述第一文件存儲結(jié)構(gòu)之前,所述方法還包括:根據(jù)所述讀取位置數(shù)值對所述第二文件進行鎖定;在從所述第二文件中讀取所述第一文件成功之后,所述方法還包括:進行鎖定釋放。
進一步地,在從所述第二文件中讀取所述第一文件之后,所述方法還包括:根據(jù)所述第一文件的文件長度更新所述讀取位置數(shù)值。
進一步地,在從所述第二文件中讀取所述第一文件之后,所述方法還包括:修改所述第二文件中的所述第一文件存儲結(jié)構(gòu)中的刪除標記,其中,修改后的所述刪除標記用于指示所述第一文件已經(jīng)被讀取。
進一步地,將獲取到的所述數(shù)據(jù)寫入所述第一文件中包括:將所述數(shù)據(jù)進行序列化;將序列化后的數(shù)據(jù)進行壓縮;將壓縮后的數(shù)據(jù)寫入所述第一文件中。
根據(jù)本發(fā)明實施例的另一方面,還提供了一種文件存儲裝置,包括:第一獲取單元,用于從緩存中獲取預定數(shù)量的數(shù)據(jù);第一寫入單元,用于將獲取到的所述數(shù)據(jù)根據(jù)第一文件存儲結(jié)構(gòu)寫入第一文件中;第二寫入單元,用于將所述第一文件根據(jù)所述第二文件存儲結(jié)構(gòu)寫入到第二文件中,其中,所述第二文件能夠?qū)懭攵鄠€所述第一文件;存儲單元,用于將所述第二文件進行存儲。
進一步地,所述第二寫入單元包括:獲取模塊,用于獲取所述第二文件存儲結(jié)構(gòu)中的寫入位置數(shù)值,其中,所述寫入位置數(shù)值用于所述第二文件中能夠?qū)懭胨龅谝晃募钠鹗嘉恢?;第一鎖定模塊,用于根據(jù)所述第一文件的大小從所述寫入位置數(shù)值鎖定用于存儲所述第一文件的數(shù)據(jù)長度區(qū)域;第一寫入模塊,用于在鎖定成功后,將所述第一文件寫入到所述數(shù)據(jù)長度區(qū)域;更新模塊,用于在寫入成功后,進行鎖定釋放并且更新所述寫入位置數(shù)值。
進一步地,還包括:鎖定單元,用于在鎖定失敗之后,等待預定時長后,重新根據(jù)所述第一文件的大小從所述寫入位置數(shù)值鎖定用于存儲所述第一文件的數(shù)據(jù)長度區(qū)域。
進一步地,所述裝置還包括:第二獲取單元,用于將所述第二文件進行存儲之后,獲取所述第二文件;第一讀取單元,用于將所述第二文件進行存儲之后,根據(jù)所述第二文件存儲結(jié)構(gòu)中的讀取位置數(shù)值讀取所述第一文件存儲結(jié)構(gòu),其中,所述第一文件存儲中結(jié)構(gòu)中至少包括所述第一文件的文件長度,所述第二文件包括多個所述第一文件;第二讀取單元,用于根據(jù)所述第一文件的文件長度從所述第二文件中讀取所述第一文件。
進一步地,所述裝置還包括:第二鎖定模塊,用于在根據(jù)所述第二文件存儲結(jié)構(gòu)中的讀取位置數(shù)值讀取所述第一文件存儲結(jié)構(gòu)之前,根據(jù)所述讀取位置數(shù)值對所述第二文件進行鎖定;釋放模塊,用于在從所述第二文件中讀取所述第一文件成功之后,進行鎖定釋放。
進一步地,所述裝置還包括:更新單元,用于在從所述第二文件中讀取所述第一文件之后,根據(jù)所述第一文件的文件長度更新所述讀取位置數(shù)值。
進一步地,所述裝置還包括:修改單元,用于在從所述第二文件中讀取所述第一文件之后,修改所述第二文件中的所述第一文件存儲結(jié)構(gòu)中的刪除標記,其中,修改后的所述刪除標記用于指示所述第一文件已經(jīng)被讀取。
進一步地,所述第一寫入單元包括:序列化模塊,用于將所述數(shù)據(jù)進行序列化;壓縮模塊,用于將序列化后的數(shù)據(jù)進行壓縮;第二寫入模塊,用于將壓縮后的數(shù)據(jù)寫入所述第一文件中。
在本發(fā)明實施例中,從緩存中獲取預定數(shù)量的數(shù)據(jù),然后將獲取到的數(shù)據(jù)根據(jù)第一文件存儲結(jié)構(gòu)寫入第一文件中,并將第一文件根據(jù)第二文件存儲結(jié)構(gòu)寫入到第二文件中,其中,第二文件能夠?qū)懭攵鄠€第一文件,在將第二文件進行存儲。通過本發(fā)明實施例,解決了相關(guān)技術(shù)中文件存儲的性能較低的技術(shù)問題,從而實現(xiàn)了提高文件存儲的性能的技術(shù)效果。
附圖說明
此處所說明的附圖用來提供對本發(fā)明的進一步理解,構(gòu)成本申請的一部分,本發(fā)明的示意性實施例及其說明用于解釋本發(fā)明,并不構(gòu)成對本發(fā)明的不當限定。在附圖中:
圖1是根據(jù)本發(fā)明實施例的文件存儲方法的流程圖;
圖2是根據(jù)本發(fā)明實施例的小文件存儲結(jié)構(gòu)的示意圖;
圖3是根據(jù)本發(fā)明實施例的大文件存儲結(jié)構(gòu)的示意圖;
圖4是根據(jù)本發(fā)明實施例的文件寫入的流程圖;
圖5是根據(jù)本發(fā)明實施例的文件讀取的流程圖;
圖6是根據(jù)本發(fā)明實施例的文件數(shù)據(jù)恢復的流程圖;以及
圖7是根據(jù)本發(fā)明實施例的文件存儲裝置的示意圖。
具體實施方式
為了使本技術(shù)領(lǐng)域的人員更好地理解本發(fā)明方案,下面將結(jié)合本發(fā)明實施例中的附圖,對本發(fā)明實施例中的技術(shù)方案進行清楚、完整地描述,顯然,所描述的實施例僅僅是本發(fā)明一部分的實施例,而不是全部的實施例?;诒景l(fā)明中的實施例,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動前提下所獲得的所有其他實施例,都應當屬于本發(fā)明保護的范圍。
需要說明的是,本發(fā)明的說明書和權(quán)利要求書及上述附圖中的術(shù)語“第一”、“第二”等是用于區(qū)別類似的對象,而不必用于描述特定的順序或先后次序。應該理解這樣使用的數(shù)據(jù)在適當情況下可以互換,以便這里描述的本發(fā)明的實施例能夠以除了在這里圖示或描述的那些以外的順序?qū)嵤?。此外,術(shù)語“包括”和“具有”以及他們的任何變形,意圖在于覆蓋不排他的包含,例如,包含了一系列步驟或單元的過程、方法、系統(tǒng)、產(chǎn)品或設備不必限于清楚地列出的那些步驟或單元,而是可包括沒有清楚地列出的或?qū)τ谶@些過程、方法、產(chǎn)品或設備固有的其它步驟或單元。
實施例1
根據(jù)本發(fā)明實施例,提供了一種文件存儲方法的方法實施例,需要說明的是,在附圖的流程圖示出的步驟可以在諸如一組計算機可執(zhí)行指令的計算機系統(tǒng)中執(zhí)行,并且,雖然在流程圖中示出了邏輯順序,但是在某些情況下,可以以不同于此處的順序執(zhí)行所示出或描述的步驟。
在本發(fā)明實施中,由于第一文件的文件存儲量要小于第二文件的文件存儲量,所以在本發(fā)明實施例中第一文件又稱為小文件,第二文件又稱為大文件。
在本實施例中,提供了一種文件存儲方法,圖1是根據(jù)本發(fā)明實施例的文件存儲方法的流程圖,如圖1所示,該方法可以包括如下步驟:
步驟S102,從緩存中獲取預定數(shù)量的數(shù)據(jù)。
步驟S104,將獲取到的數(shù)據(jù)根據(jù)第一文件存儲結(jié)構(gòu)寫入第一文件中。
步驟S106,將第一文件根據(jù)第二文件存儲結(jié)構(gòu)寫入到第二文件中,其中,第二文件能夠?qū)懭攵鄠€第一文件。
步驟S108,將第二文件進行存儲。
通過上述步驟,從緩存中獲取預定數(shù)量的數(shù)據(jù),然后將獲取到的數(shù)據(jù)根據(jù)第一文件存儲結(jié)構(gòu)(即下述的小文件存儲結(jié)構(gòu))寫入第一文件(即下述的小文件)中,并將小文件根據(jù)第二文件存儲結(jié)構(gòu)(即下述的大文件存儲結(jié)構(gòu))寫入到第二文件(即下述的大文件)中,其中,大文件能夠?qū)懭攵鄠€小文件,在將大文件進行存儲。通過本發(fā)明實施例,解決了相關(guān)技術(shù)中文件存儲的性能較低的技術(shù)問題,從而實現(xiàn)了提高文件存儲的性能的技術(shù)效果。
在步驟S102提供的技術(shù)方案中,從內(nèi)存緩存中獲取指定量的數(shù)據(jù)。
在步驟S104提供的技術(shù)方案中,首先從緩存中根據(jù)閾值的觸發(fā)獲取緩存數(shù)據(jù),然后需要有創(chuàng)建小文件存儲結(jié)構(gòu),圖2是根據(jù)本發(fā)明實施例的小文件存儲結(jié)構(gòu)的示意圖,如圖2所示包括:文件頭和文件體,其中,文件頭包括文件長度、文件類型、是否刪除標記以及數(shù)據(jù)校驗位;文件體中包括數(shù)據(jù)區(qū)。再按照小文件存儲結(jié)構(gòu)的順序依次寫入指定位數(shù)的文件長度數(shù)據(jù),文件類型數(shù)據(jù),從而實現(xiàn)將獲取到的數(shù)據(jù)根據(jù)第一文件存儲結(jié)構(gòu)寫入第一文件中的效果。
在步驟S106提供的技術(shù)方案中,根據(jù)大文件存儲結(jié)構(gòu)將小文件寫入大文件指定存儲區(qū)域中,圖3是根據(jù)本發(fā)明實施例的大文件存儲結(jié)構(gòu)的示意圖,如圖3所示同樣包括文件頭和文件體兩部分,其中,文件頭包括文件長度、寫入位置、讀取位置以及文件歸結(jié)數(shù),文件體包括n個小文件和空白區(qū),n為正整數(shù)。從而實現(xiàn)了將小文件根據(jù)大文件存儲結(jié)構(gòu)寫入到大文件中,其中,如圖3所示大文件能夠?qū)懭攵鄠€小文件。最后通過步驟S108,將大文件進行存儲。
下面結(jié)合圖4對本發(fā)明一個可選的實施方式進行說明,圖4是根據(jù)本發(fā)明實施例的文件寫入的流程圖,該方法可以包括如下步驟:
步驟S401,從內(nèi)存中加載數(shù)據(jù)。
步驟S402,利用序列化技術(shù)對獲取到的數(shù)據(jù)進行序列化。
步驟S403,利用壓縮技術(shù)對獲取到的數(shù)據(jù)進行壓縮。
步驟S404,根據(jù)小文件存儲結(jié)構(gòu)進行數(shù)據(jù)填充。
步驟S405,判斷是否存在可寫入的大文件;在不存在可寫入的大文件的情況下,執(zhí)行步驟S406,否則,執(zhí)行步驟S407。
步驟S406,根據(jù)大文件存儲結(jié)構(gòu)創(chuàng)建大文件。
步驟S407,獲取大文件中寫入?yún)^(qū)域的文件鎖。
步驟S408,將小文件數(shù)據(jù)寫入到大文件的指定位置。
步驟S409,更新大文件的歸結(jié)數(shù)及寫入位置。
步驟S410,釋放大文件中寫入位置文件鎖。
在上述步驟中,首先執(zhí)行步驟S401,從內(nèi)存中加載數(shù)據(jù);再通過步驟S402利用序列化技術(shù),將數(shù)據(jù)轉(zhuǎn)換成字節(jié)數(shù)組;執(zhí)行步驟S403,利用壓縮技術(shù),選擇合適的壓縮算法對序列化后的數(shù)據(jù)進行壓縮,降低存儲開銷;接下來執(zhí)行步驟S404,創(chuàng)建小文件存儲結(jié)構(gòu),按照圖2所示的順序依次寫入指定位數(shù)的文件長度數(shù)據(jù),文件類型數(shù)據(jù),根據(jù)數(shù)據(jù)壓縮后的結(jié)果計算md5校驗碼數(shù)據(jù)和壓縮后的數(shù)據(jù),根據(jù)小文件存儲結(jié)構(gòu)對小文件進行數(shù)據(jù)填充,在此步驟中需要獲取大文件存儲結(jié)構(gòu)中的寫入位置數(shù)值,其中,寫入位置數(shù)值用于大文件中能夠?qū)懭胄∥募钠鹗嘉恢?;通過步驟S405,判斷是否存在可寫入的大文件;在不存在可寫入的大文件的情況下,執(zhí)行步驟S406,根據(jù)大文件存儲結(jié)構(gòu)創(chuàng)建大文件,然后執(zhí)行步驟S407;在存在可寫入的大文件的情況下,執(zhí)行步驟S407,獲取大文件中寫入?yún)^(qū)域的文件鎖,利用文件鎖定位置向后鎖定小文件存儲的數(shù)據(jù)長度區(qū)域,在鎖定失敗之后,等待預定時長(例如30秒)后,重新根據(jù)小文件的大小從寫入位置數(shù)值鎖定用于存儲小的數(shù)據(jù)長度區(qū)域;鎖定成功后重新讀取文件寫入位置數(shù)值,寫入數(shù)據(jù)成功后,更新大文件歸結(jié)數(shù)據(jù)值和文件寫入數(shù)據(jù)位置值后釋放文件鎖定;然后執(zhí)行步驟S408,將小文件數(shù)據(jù)寫入到大文件的指定位置;再執(zhí)行步驟S409,更新大文件的歸結(jié)數(shù)及寫入位置;最后步驟S410釋放大文件中寫入位置文件鎖。
下面結(jié)合圖5對本發(fā)明一個可選的實施方式進行說明,圖5是根據(jù)本發(fā)明實施例的文件讀取的流程圖,該方法可以包括如下步驟:
步驟S501,嘗試獲取大文件讀取區(qū)域文件鎖。
步驟S502,鎖定獲取的大文件讀取區(qū)域的文件鎖,獲得大文件讀取位置。
步驟S503,從鎖定位置讀取小文件的文件頭數(shù)據(jù)。
步驟S504,根據(jù)文件頭數(shù)據(jù)確認小文件的文件數(shù)據(jù)信息。
步驟S505,根據(jù)文件頭數(shù)據(jù)確認小文件是否刪除;在沒有刪除的情況下執(zhí)行步驟,執(zhí)行步驟S506,否則,執(zhí)行步驟S507。
步驟S506,文件體重新加載指定長度數(shù)據(jù)。
步驟S507,返回錯誤提示。
步驟S508,判斷使用校驗位數(shù)據(jù)對數(shù)據(jù)進行校驗的結(jié)果是否一致;在校驗結(jié)果一致的情況下,執(zhí)行步驟S509,反之,執(zhí)行步驟S507;
步驟S509,解壓縮。
步驟S510,利用反向序列化技術(shù)將解壓縮后的數(shù)據(jù)還原成原數(shù)據(jù)。
在上述步驟中,將大文件進行存儲之后,可以獲取大文件;根據(jù)大文件存儲結(jié)構(gòu)中的讀取位置數(shù)值讀取小文件存儲結(jié)構(gòu),其中,小文件存儲中結(jié)構(gòu)中至少包括小文件的文件長度,大文件包括多個小文件,可以根據(jù)小文件的文件長度從大文件中讀取小文件。
在根據(jù)大文件存儲結(jié)構(gòu)中的讀取位置數(shù)值讀取小文件存儲結(jié)構(gòu)之前,需要執(zhí)行步驟S501,根據(jù)讀取位置數(shù)值對大文件進行鎖定,嘗試獲取大文件讀取區(qū)域文件鎖,用于定位讀取位置;在步驟S502中,嘗試鎖定大文件讀取位置;步驟S504,從鎖定位置讀取小文件的文件頭數(shù)據(jù),根據(jù)讀取的讀取位置數(shù)據(jù),從指定位置開始讀取小文件結(jié)構(gòu)數(shù)據(jù),讀取小文件的文件長度、文件類型、校驗碼及是否刪除數(shù)據(jù)標記,然后從數(shù)據(jù)區(qū)讀取數(shù)據(jù),在從大文件中讀取小文件成功之后,還需要對進行文件鎖定進行釋放操作;在步驟S505中,根據(jù)文件頭數(shù)據(jù)確認小文件是否刪除,在沒有刪除的情況下通過執(zhí)行步驟S506,對文件體重新加載指定長度數(shù)據(jù),也即根據(jù)小文件的文件長度更新讀取位置數(shù)值;否則,執(zhí)行步驟S507,更改小文件數(shù)據(jù)刪除位標志為刪除狀態(tài),返回錯誤提示;在步驟S508中,判斷使用校驗位數(shù)據(jù)對數(shù)據(jù)進行校驗的結(jié)果是否一致,在校驗結(jié)果一致的情況下,執(zhí)行步驟S509,讀取的數(shù)據(jù)區(qū)數(shù)據(jù)域校驗碼進行比較判斷,保證數(shù)據(jù)完整性,通過步驟S509進行解壓縮,并通過步驟S510進行反序列化恢復成原數(shù)據(jù)。
在一個可選的實施例中,從大文件中讀取小文件之后,還需要修改大文件中的小文件存儲結(jié)構(gòu)中的刪除標記,其中,修改后的刪除標記用于指示小文件已經(jīng)被讀取。
下面結(jié)合圖6對本發(fā)明一個可選的實施方式進行說明,圖6是根據(jù)本發(fā)明實施例的文件數(shù)據(jù)恢復的流程圖,該方法可以包括如下步驟:
步驟S601,解析大文件的文件頭。
步驟S602,獲取小文件在大文件存儲區(qū)域的位置。
步驟S603,嘗試讀取小文件。
步驟S604,判斷是否到大文件的文件體結(jié)尾。在到大文件的文件體結(jié)尾的情況下,執(zhí)行步驟S605;反之,執(zhí)行步驟S606。
步驟S605,小文件數(shù)據(jù)恢復完成。
步驟S606,按照小文件存儲結(jié)構(gòu)讀取小文件信息并進行解壓與反序列化操作。
步驟S607,存儲解析后的原始數(shù)據(jù)。
在上述步驟中,通過解析大文件的文件頭,實現(xiàn)根據(jù)大文件定位數(shù)據(jù)結(jié)構(gòu)定位數(shù)據(jù)存儲區(qū)的小文件起始位置,解析數(shù)據(jù)結(jié)構(gòu);如圖3所示大文件存儲結(jié)構(gòu)包括文件頭(例如文件長度、文件歸結(jié)數(shù)、寫入位置及文件讀取位)和文件體;在步驟S602中,獲取小文件在大文件中存儲區(qū)域的位置,如圖2所示小文件存儲結(jié)構(gòu)也包括文件頭(例如文件長度、文件類型、是否刪除標記以及數(shù)據(jù)校驗位)和文件體;在步驟S603中,根據(jù)大文件存儲結(jié)構(gòu)定位數(shù)據(jù)存儲區(qū)的小文件起始位置,嘗試讀取小文件,在步驟S604中,判斷是否到大文件的文件體結(jié)尾;在到大文件的文件體結(jié)尾的情況下,執(zhí)行步驟S605,也即小文件數(shù)據(jù)恢復完成;反之,執(zhí)行步驟S606,按照小文件存儲結(jié)構(gòu)讀取小文件信息并進行解壓與反序列化操作;在步驟S607中,根據(jù)小文件存儲結(jié)構(gòu)順序解析校驗小文件,按文件存儲順序依次恢復,存儲解析后的原始數(shù)據(jù)。
在本發(fā)明中,首先根據(jù)業(yè)務需求定義大文件存儲結(jié)構(gòu),然后定義小文件存儲結(jié)構(gòu);根據(jù)小文件定義結(jié)構(gòu)順序解析校驗小文件,按文件存儲順序依次恢復存儲數(shù)據(jù)。從緩存中根據(jù)閾值觸發(fā)獲取緩存數(shù)據(jù);根據(jù)小文件存儲結(jié)構(gòu)對緩存數(shù)據(jù)進行壓縮封裝;根據(jù)大文件存儲結(jié)構(gòu)將小文件寫入大文件指定存儲區(qū)域,同時更新大文件相關(guān)緩存信息;邏輯刪除更改指定小文件邏輯刪除位數(shù)值即可;數(shù)據(jù)讀取從大文件指定存儲結(jié)構(gòu)中獲取等待讀取的下一小文件位置,從大文件存儲的該位置讀取小文件數(shù)據(jù),按小文件結(jié)構(gòu)進行數(shù)據(jù)封裝,校驗刪除位,校驗驗證位數(shù)據(jù)是否一致,決定是否返回實際緩存數(shù)據(jù);數(shù)據(jù)恢復從大文件存儲區(qū)進行順序讀取小文件存儲結(jié)構(gòu),進行數(shù)據(jù)恢復,如果某個緩存文件數(shù)據(jù)錯誤不影響后續(xù)文件讀??;數(shù)據(jù)轉(zhuǎn)儲備份,直接進行大文件的壓縮轉(zhuǎn)儲。
本實施例中的基于文件的可恢復的數(shù)據(jù)緩存方法降低了文件索引開銷和目錄訪問開銷,實現(xiàn)了目錄訪問速度從分鐘為單位的訪問變成毫秒級訪問的效果;同時在運維級別通過大文件方式能夠有效降低數(shù)據(jù)存儲備份所需時間,例如采用本發(fā)明能夠?qū)⑼瑯拥奶幚矸绞綇?個小時壓縮到10分鐘;另外在硬件級別上,也使得硬盤故障率直線下降,從而提高了客戶體驗。
實施例2
本發(fā)明實施例還提供了一種文件存儲裝置,需要說明的是,本發(fā)明實施例的文件存儲裝置可以用于執(zhí)行本發(fā)明實施例所提供的用于文件存儲方法。以下對本發(fā)明實施例提供的文件存儲裝置進行介紹。
圖7是根據(jù)本發(fā)明實施例的一種文件存儲裝置的示意圖,如圖7所示,該裝置可以包括:第一獲取單元71、第一寫入單元73、第二寫入單元75以及存儲單元77。下面對該裝置進行說明。
第一獲取單元71,用于從緩存中獲取預定數(shù)量的數(shù)據(jù)。
第一寫入單元73,用于將獲取到的數(shù)據(jù)根據(jù)第一文件存儲結(jié)構(gòu)寫入第一文件中。
第二寫入單元75,用于將第一文件根據(jù)第二文件存儲結(jié)構(gòu)寫入到第二文件中,其中,第二文件能夠?qū)懭攵鄠€第一文件。
存儲單元77,用于將第二文件進行存儲。
在本發(fā)明實施例的一種文件存儲裝置中,通過第一獲取單元71,用于從緩存中獲取預定數(shù)量的數(shù)據(jù);第一寫入單元73,用于將獲取到的數(shù)據(jù)根據(jù)第一文件存儲結(jié)構(gòu)寫入第一文件中;第二寫入單元75,用于將第一文件根據(jù)第二文件存儲結(jié)構(gòu)寫入到第二文件中,其中,第二文件能夠?qū)懭攵鄠€第一文件;存儲單元77,用于將第二文件進行存儲,解決了相關(guān)技術(shù)中文件存儲的性能較低的技術(shù)問題,從而實現(xiàn)了提高文件存儲的性能的技術(shù)效果。
可選地,在本發(fā)明實施例的一種文件存儲裝置中,第二寫入單元75包括:獲取模塊,用于獲取第二文件存儲結(jié)構(gòu)中的寫入位置數(shù)值,其中,寫入位置數(shù)值用于第二文件中能夠?qū)懭氲谝晃募钠鹗嘉恢茫坏谝绘i定模塊,用于根據(jù)第一文件的大小從寫入位置數(shù)值鎖定用于存儲第一文件的數(shù)據(jù)長度區(qū)域;第一寫入模塊,用于在鎖定成功后,將第一文件寫入到數(shù)據(jù)長度區(qū)域;更新模塊,用于在寫入成功后,進行鎖定釋放并且更新寫入位置數(shù)值。
可選地,在本發(fā)明實施例的一種文件存儲裝置中,還包括:鎖定單元,用于在鎖定失敗之后,等待預定時長后,重新根據(jù)第一文件的大小從寫入位置數(shù)值鎖定用于存儲第一文件的數(shù)據(jù)長度區(qū)域。
可選地,在本發(fā)明實施例的一種文件存儲裝置中,裝置還包括:第二獲取單元,用于將第二文件進行存儲之后,獲取第二文件;第一讀取單元,用于將第二文件進行存儲之后,根據(jù)第二文件存儲結(jié)構(gòu)中的讀取位置數(shù)值讀取第一文件存儲結(jié)構(gòu),其中,第一文件存儲中結(jié)構(gòu)中至少包括第一文件的文件長度,第二文件包括多個第一文件;第二讀取單元,用于根據(jù)第一文件的文件長度從第二文件中讀取第一文件。
可選地,在本發(fā)明實施例的一種文件存儲裝置中,裝置還包括:第二鎖定模塊,用于在根據(jù)第二文件存儲結(jié)構(gòu)中的讀取位置數(shù)值讀取第一文件存儲結(jié)構(gòu)之前,根據(jù)讀取位置數(shù)值對第二文件進行鎖定;釋放模塊,用于在從第二文件中讀取第一文件成功之后,進行鎖定釋放。
可選地,在本發(fā)明實施例的一種文件存儲裝置中,裝置還包括:更新單元,用于在從第二文件中讀取第一文件之后,根據(jù)第一文件的文件長度更新讀取位置數(shù)值。
可選地,在本發(fā)明實施例的一種文件存儲裝置中,裝置還包括:修改單元,用于在從第二文件中讀取第一文件之后,修改第二文件中的第一文件存儲結(jié)構(gòu)中的刪除標記,其中,修改后的刪除標記用于指示第一文件已經(jīng)被讀取。
可選地,在本發(fā)明實施例的一種文件存儲裝置中,第一寫入單元73包括:序列化模塊,用于將數(shù)據(jù)進行序列化;壓縮模塊,用于將序列化后的數(shù)據(jù)進行壓縮;第二寫入模塊,用于將壓縮后的數(shù)據(jù)寫入第一文件中。
上述本發(fā)明實施例序號僅僅為了描述,不代表實施例的優(yōu)劣。
在本發(fā)明的上述實施例中,對各個實施例的描述都各有側(cè)重,某個實施例中沒有詳述的部分,可以參見其他實施例的相關(guān)描述。
在本申請所提供的幾個實施例中,應該理解到,所揭露的技術(shù)內(nèi)容,可通過其它的方式實現(xiàn)。其中,以上所描述的裝置實施例僅僅是示意性的,例如所述單元的劃分,可以為一種邏輯功能劃分,實際實現(xiàn)時可以有另外的劃分方式,例如多個單元或組件可以結(jié)合或者可以集成到另一個系統(tǒng),或一些特征可以忽略,或不執(zhí)行。另一點,所顯示或討論的相互之間的耦合或直接耦合或通信連接可以是通過一些接口,單元或模塊的間接耦合或通信連接,可以是電性或其它的形式。
所述作為分離部件說明的單元可以是或者也可以不是物理上分開的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位于一個地方,或者也可以分布到多個單元上??梢愿鶕?jù)實際的需要選擇其中的部分或者全部單元來實現(xiàn)本實施例方案的目的。
另外,在本發(fā)明各個實施例中的各功能單元可以集成在一個處理單元中,也可以是各個單元單獨物理存在,也可以兩個或兩個以上單元集成在一個單元中。上述集成的單元既可以采用硬件的形式實現(xiàn),也可以采用軟件功能單元的形式實現(xiàn)。
所述集成的單元如果以軟件功能單元的形式實現(xiàn)并作為獨立的產(chǎn)品銷售或使用時,可以存儲在一個計算機可讀取存儲介質(zhì)中。基于這樣的理解,本發(fā)明的技術(shù)方案本質(zhì)上或者說對現(xiàn)有技術(shù)做出貢獻的部分或者該技術(shù)方案的全部或部分可以以軟件產(chǎn)品的形式體現(xiàn)出來,該計算機軟件產(chǎn)品存儲在一個存儲介質(zhì)中,包括若干指令用以使得一臺計算機設備(可為個人計算機、服務器或者網(wǎng)絡設備等)執(zhí)行本發(fā)明各個實施例所述方法的全部或部分步驟。而前述的存儲介質(zhì)包括:U盤、只讀存儲器(ROM,Read-Only Memory)、隨機存取存儲器(RAM,Random Access Memory)、移動硬盤、磁碟或者光盤等各種可以存儲程序代碼的介質(zhì)。
以上所述僅是本發(fā)明的優(yōu)選實施方式,應當指出,對于本技術(shù)領(lǐng)域的普通技術(shù)人員來說,在不脫離本發(fā)明原理的前提下,還可以做出若干改進和潤飾,這些改進和潤飾也應視為本發(fā)明的保護范圍。