国产精品1024永久观看,大尺度欧美暖暖视频在线观看,亚洲宅男精品一区在线观看,欧美日韩一区二区三区视频,2021中文字幕在线观看

  • <option id="fbvk0"></option>
    1. <rt id="fbvk0"><tr id="fbvk0"></tr></rt>
      <center id="fbvk0"><optgroup id="fbvk0"></optgroup></center>
      <center id="fbvk0"></center>

      <li id="fbvk0"><abbr id="fbvk0"><dl id="fbvk0"></dl></abbr></li>

      數(shù)據(jù)存儲方法及數(shù)據(jù)存儲系統(tǒng)的制作方法

      文檔序號:6376913閱讀:149來源:國知局
      專利名稱:數(shù)據(jù)存儲方法及數(shù)據(jù)存儲系統(tǒng)的制作方法
      技術(shù)領(lǐng)域
      本發(fā)明涉及數(shù)據(jù)存儲技術(shù),尤其涉及一種數(shù)據(jù)存儲方法及數(shù)據(jù)存儲系統(tǒng)。
      背景技術(shù)
      目前,內(nèi)存數(shù)據(jù)持久化存儲主要采用純內(nèi)存存儲引擎,主要包括持久化消息隊列(mcq, MemcacheQ)、遠程字典服務(wù)器(Redis, Remote Dictionary Server)以及關(guān)系型數(shù)據(jù)庫管理系統(tǒng)(Mysql)等,Memcached暫時沒有自帶的數(shù)據(jù)落地方法,Redis則自帶有不斷添加模式(A0F, Append Only Mode)文件和快照(snapshot)兩種方式,Mysql的內(nèi)存表則通過主動調(diào)用轉(zhuǎn)儲(dump)命令來將數(shù)據(jù)全部導出,然后寫入磁盤?,F(xiàn)有支持數(shù)據(jù)落地的內(nèi)存存儲引擎,Redis的AOF文件實現(xiàn)了增量備份(binlog),即對新增加的數(shù)據(jù)更新命令進行備份,通過將數(shù)據(jù)更新命令追加寫入到磁盤,這樣,可保證 用戶的數(shù)據(jù)更新命令能夠被及時寫入到磁盤,服務(wù)異常退出后,可以根據(jù)AOF文件中存儲的數(shù)據(jù)更新命令來恢復數(shù)據(jù),但該方法隨著數(shù)據(jù)更新命令的不斷增多,使得AOF文件的數(shù)據(jù)量越來越大,數(shù)據(jù)恢復所需的時間會越來越長。為了降低數(shù)據(jù)恢復所需的時間,Redis引入了 AOF文件重寫機制,其功能就是重新生成一份AOF文件,新的AOF文件中一條記錄的數(shù)據(jù)更新命令只會有一次,而現(xiàn)有常規(guī)的AOF文件,記錄了對同一數(shù)據(jù)的多次更新命令,這樣,可以減小AOF文件的大小,但該方法在重寫AOF文件時,由于Redis在重寫AOF文件時會占用大量的CPU和內(nèi)存資源,導致負載過高,出現(xiàn)短暫的服務(wù)暫?,F(xiàn)象,因而,在重寫時,導致數(shù)據(jù)丟失問題,不能保障數(shù)據(jù)的安全性;而且,AOF文件的重寫,也將影響Redis的數(shù)據(jù)處理性能,降低了數(shù)據(jù)更新命令的寫入速度。對于Redis的snapshot模式,是定期dump模式,即定期將內(nèi)存數(shù)據(jù)批量寫入磁盤,與Mysql的內(nèi)存表的dump命令性質(zhì)相同,如果發(fā)生服務(wù)重啟或中斷等異常,在兩次snapshot期間發(fā)生的數(shù)據(jù)更新,由于未能及時寫入磁盤,將會全部丟失;而且,隨著更新的數(shù)據(jù)不斷增多,從磁盤恢復數(shù)據(jù)所需的時間會越來越長。由上述可見,現(xiàn)有的數(shù)據(jù)存儲方法,無論是采用AOF文件存儲方式還是snapshot存儲方式,或是Mysql的dump存儲方式,在恢復數(shù)據(jù)時,都存在數(shù)據(jù)恢復所需的時間較長、數(shù)據(jù)丟失的技術(shù)問題。

      發(fā)明內(nèi)容
      本發(fā)明的實施例提供一種數(shù)據(jù)存儲方法,降低數(shù)據(jù)恢復所需的時間、避免數(shù)據(jù)丟失。本發(fā)明的實施例還提供一種數(shù)據(jù)存儲系統(tǒng),降低數(shù)據(jù)恢復所需的時間、避免數(shù)據(jù)丟失。為達到上述目的,本發(fā)明實施例提供的一種數(shù)據(jù)存儲方法,包括接收數(shù)據(jù)更新命令,為數(shù)據(jù)更新命令分配游標;
      將接收的數(shù)據(jù)更新命令以及分配的游標寫入不斷添加模式AOF文件,并將AOF文件寫入磁盤;根據(jù)數(shù)據(jù)更新命令更新數(shù)據(jù),在更新數(shù)據(jù)成功后,按照預先設(shè)置的時間周期,將數(shù)據(jù)寫入磁盤中的數(shù)據(jù)文件,將為數(shù)據(jù)更新命令分配的游標寫入磁盤中的游標文件;重啟服務(wù),加載磁盤數(shù)據(jù)文件中的數(shù)據(jù),獲取游標文件中順序位最高的游標,從存儲的AOF文件中,加載該游標對應的數(shù)據(jù)更新命令之后的數(shù)據(jù)更新命令。其中,所述為數(shù)據(jù)更新命令分配游標包括判斷當前接收的數(shù)據(jù)更新命令是否為接收的第一條數(shù)據(jù)更新命令,如果是,為接收的數(shù)據(jù)更新命令分配游標序列號,并記錄分配的游標序列號信息;如果不是,將記錄的游標序列號進行累加,為接收數(shù)據(jù)更新命令設(shè)置累加的游標序列號,記錄累加的游標序列號 信息。其中,所述為數(shù)據(jù)更新命令分配游標包括判斷AOF文件中是否存在寫入的數(shù)據(jù)更新命令,如果不存在,為接收的數(shù)據(jù)更新命令分配游標序列號;如果存在,獲取AOF文件中當前已寫入的數(shù)據(jù)更新命令的游標序列號信息,對獲取的游標序列號進行累加,為接收的數(shù)據(jù)更新命令設(shè)置累加的游標序列號。其中,所述將為數(shù)據(jù)更新命令分配的游標寫入磁盤中的游標文件包括獲取預先設(shè)置的時間周期內(nèi),更新數(shù)據(jù)成功對應的數(shù)據(jù)更新命令,將為所述更新數(shù)據(jù)成功對應的數(shù)據(jù)更新命令分配的游標寫入磁盤中的游標文件。其中,所述將為數(shù)據(jù)更新命令分配的游標寫入磁盤中的游標文件進一步包括讀取游標文件中最新存儲的游標序列號;判斷為數(shù)據(jù)更新命令分配的游標序列號是否大于游標文件中最新存儲的游標序列號,如果是,將為數(shù)據(jù)更新命令分配的游標寫入磁盤中的游標文件;否則,不作處理。其中,所述將數(shù)據(jù)寫入磁盤中的數(shù)據(jù)文件之后,進一步包括刪除數(shù)據(jù)文件中除最近更新數(shù)據(jù)外的其他數(shù)據(jù)。其中,所述將為數(shù)據(jù)更新命令分配的游標寫入磁盤中的游標文件之后,進一步包括存儲游標文件中最大的游標序列號,刪除游標文件中除最大游標序列號外的其他游標序列號。其中,所述加載磁盤數(shù)據(jù)文件中的數(shù)據(jù),獲取游標文件中順序位最高的游標,從存儲的AOF文件中,加載該游標對應的數(shù)據(jù)更新命令之后的數(shù)據(jù)更新命令包括讀取數(shù)據(jù)文件,獲取數(shù)據(jù)文件中最近更新的數(shù)據(jù);從游標文件中,獲取游標文件中順序位最大的游標序列號;根據(jù)該最大的游標序列號,查詢存儲的AOF文件,根據(jù)AOF文件中的映射關(guān)系,獲取最大的游標序列號對應的數(shù)據(jù)更新命令;對獲取的數(shù)據(jù)文件中最近更新的數(shù)據(jù),依序執(zhí)行最大的游標序列號對應的數(shù)據(jù)更新命令之后的數(shù)據(jù)更新命令。一種數(shù)據(jù)存儲系統(tǒng),該數(shù)據(jù)存儲系統(tǒng)包括游標分配器、不斷添加模式AOF文件存儲器、數(shù)據(jù)文件存儲器、游標文件存儲器以及數(shù)據(jù)恢復器,其中,游標分配器,用于接收數(shù)據(jù)更新命令,為數(shù)據(jù)更新命令分配游標;
      AOF文件存儲器,用于將接收的數(shù)據(jù)更新命令以及分配的游標寫入AOF文件,存儲寫入的AOF文件;數(shù)據(jù)文件存儲器,用于根據(jù)數(shù)據(jù)更新命令更新數(shù)據(jù),在更新數(shù)據(jù)成功后,按照預先設(shè)置的時間周期,存儲寫入的數(shù)據(jù)文件,向游標文件存儲器輸出觸發(fā)信息;游標文件存儲器,用于接收觸發(fā)信息,存儲將為數(shù)據(jù)更新命令分配的游標信息;數(shù)據(jù)恢復器,用于重啟服務(wù),加載磁盤中數(shù)據(jù)文件存儲器中的數(shù)據(jù),獲取游標文件存儲器中順序位最高的游標,從AOF文件存儲器存儲的AOF文件中,加載該游標對應的數(shù)據(jù)更新命令之后的數(shù)據(jù)更新命令。所述AOF文件存儲器、數(shù)據(jù)文件存儲器以及游標文件存儲器分別為一個或多個。所述游標分配器包括接收模塊、判斷模塊、分配模塊以及累加模塊,其中,接收模塊,用于接收數(shù)據(jù)更新命令,輸出至判斷模塊;判斷模塊,用于判斷當前接收的數(shù)據(jù)更新命令是否為接收的第一條數(shù)據(jù)更新命令,如果是,輸出至分配模塊,如果不是,輸出至累加模塊;分配模塊,用于為接收的數(shù)據(jù)更新命令分配游標序列號,并記錄分配的游標序列
      號信息;累加模塊,用于將記錄的游標序列號進行累加,為接收數(shù)據(jù)更新命令設(shè)置累加的游標序列號,記錄累加的游標序列號信息。所述游標分配器包括接收模塊、判斷模塊、分配模塊、獲取模塊以及累加模塊,其中,接收模塊,用于接收數(shù)據(jù)更新命令,輸出至判斷模塊;判斷模塊,用于判斷AOF文件中是否存在寫入的數(shù)據(jù)更新命令,如果不存在,通知分配模塊,如果存在,通知獲取模塊;分配模塊,用于接收通知,為接收的數(shù)據(jù)更新命令分配游標序列號;獲取模塊,用于接收通知,獲取AOF文件中當前已寫入的數(shù)據(jù)更新命令的游標序列號信息;累加模塊,用于對獲取的游標序列號進行累加,為接收的數(shù)據(jù)更新命令設(shè)置累加的游標序列號。所述數(shù)據(jù)恢復器包括重啟模塊、數(shù)據(jù)文件讀取模塊、游標文件讀取模塊、查詢模塊以及更新模塊,其中,重啟模塊,用于重啟服務(wù);數(shù)據(jù)文件讀取模塊,用于讀取數(shù)據(jù)文件存儲器中存儲的數(shù)據(jù)文件,獲取數(shù)據(jù)文件中最近更新的數(shù)據(jù);游標文件讀取模塊,用于從游標文件存儲器存儲的游標文件中,獲取游標文件中順序位最大的游標序列號;查詢模塊,用于根據(jù)該最大的游標序列號,查詢AOF文件存儲器中存儲的AOF文件,根據(jù)AOF文件中的映射關(guān)系,獲取最大的游標序列號對應的數(shù)據(jù)更新命令;更新模塊,用于對獲取的數(shù)據(jù)文件中最近更新的數(shù)據(jù),依序執(zhí)行最大的游標序列號對應的數(shù)據(jù)更新命令之后的數(shù)據(jù)更新命令。由上述技術(shù)方案可見,本發(fā)明實施例提供的一種數(shù)據(jù)存儲方法及數(shù)據(jù)存儲系統(tǒng),接收數(shù)據(jù)更新命令,為數(shù)據(jù)更新命令分配游標;將接收的數(shù)據(jù)更新命令以及分配的游標寫入不斷添加模式AOF文件,并將AOF文件寫入磁盤;根據(jù)數(shù)據(jù)更新命令更新數(shù)據(jù),在更新數(shù)據(jù)成功后,按照預先設(shè)置的時間周期,將數(shù)據(jù)寫入磁盤中的數(shù)據(jù)文件,將為數(shù)據(jù)更新命令分配的游標寫入磁盤中的游標文件;重啟服務(wù),加載磁盤數(shù)據(jù)文件中的數(shù)據(jù),獲取游標文件中順序位最高的游標,從存儲的AOF文件中,加載該游標對應的數(shù)據(jù)更新命令之后的數(shù)據(jù)更新命令。這樣,通過為順序存儲的數(shù)據(jù)更新命令分配游標,在內(nèi)存數(shù)據(jù)庫中數(shù)據(jù)成功更新后,存儲該更新數(shù)據(jù)的更新命令對應的游標信息,在進行數(shù)據(jù)恢復時,獲取最后更新成功的數(shù)據(jù),并依據(jù)該數(shù)據(jù)對應的游標信息,讀取AOF文件中該游標信息后順序存儲的對應的數(shù)據(jù)更新命令,進行數(shù)據(jù)恢復,可以避免兩次時間周期之間,由于服務(wù)重啟造成的數(shù)據(jù)更新丟失問題,以及,AOF文件過大引起的數(shù)據(jù)恢復時間過長問題。


      為了更清楚地說明本發(fā)明實施例或現(xiàn)有技術(shù)中的技術(shù)方案,以下將對實施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡單地介紹。顯而易見地,以下描述中的附圖僅僅是本發(fā)明的一些實施例,對于本領(lǐng)域普通技術(shù)人員而言,還可以根據(jù)這些附圖所示實施例得到 其它的實施例及其附圖。圖I為本發(fā)明實施例的數(shù)據(jù)存儲方法流程示意圖。圖2為本發(fā)明實施例內(nèi)存數(shù)據(jù)庫處理數(shù)據(jù)更新命令的流程示意圖。圖3為本發(fā)明實施例內(nèi)恢復數(shù)據(jù)的流程示意圖。圖4為本發(fā)明實施例的數(shù)據(jù)存儲系統(tǒng)結(jié)構(gòu)示意圖。
      具體實施例方式以下將結(jié)合附圖對本發(fā)明各實施例的技術(shù)方案進行清楚、完整的描述,顯然,所描述的實施例僅僅是本發(fā)明的一部分實施例,而不是全部的實施例?;诒景l(fā)明中的實施例,本領(lǐng)域普通技術(shù)人員在沒有做出創(chuàng)造性勞動的前提下所得到的所有其它實施例,都屬于本發(fā)明所保護的范圍。現(xiàn)有的數(shù)據(jù)存儲方法,根據(jù)AOF文件中存儲的數(shù)據(jù)更新命令來恢復數(shù)據(jù),當數(shù)據(jù)更新命令不斷增多時,AOF文件的數(shù)據(jù)量越來越大,使得數(shù)據(jù)恢復所需的時間越來越長;而采用AOF文件重寫機制,雖然可以一定程度上降低數(shù)據(jù)恢復所需的時間,但會導致數(shù)據(jù)丟失問題,數(shù)據(jù)的安全性不高;而對于Redis的snapshot模式,隨著更新的數(shù)據(jù)不斷增多,從磁盤恢復數(shù)據(jù)所需的時間也會變長,如果發(fā)生服務(wù)重啟或中斷等異常,在兩次snapshot期間發(fā)生的數(shù)據(jù)更新,由于未能及時寫入磁盤,將會全部丟失。這樣,在對數(shù)據(jù)安全性要求較高的情況下,服務(wù)異常不僅會導致數(shù)據(jù)存儲的效率降低,也降低了用戶的業(yè)務(wù)體驗。本發(fā)明實施例提出的數(shù)據(jù)存儲方法,考慮對數(shù)據(jù)更新命令進行順序化存儲,并為順序存儲的數(shù)據(jù)更新命令分配游標(ID),在內(nèi)存數(shù)據(jù)庫中數(shù)據(jù)成功更新后,存儲該更新數(shù)據(jù)的更新命令對應的游標信息,在進行數(shù)據(jù)恢復時,獲取最后更新成功的數(shù)據(jù),并依據(jù)該數(shù)據(jù)對應的游標信息,讀取AOF文件中該游標信息后順序存儲的對應的數(shù)據(jù)更新命令,進行數(shù)據(jù)恢復。從而著重解決在內(nèi)存數(shù)據(jù)存儲中,如何保證兩次snapshot期間服務(wù)重啟造成的數(shù)據(jù)更新丟失問題,以及,AOF文件過大引起的數(shù)據(jù)恢復時間過長問題。
      圖I為本發(fā)明實施例的數(shù)據(jù)存儲方法流程示意圖。參見圖I,該流程包括步驟101,接收數(shù)據(jù)更新命令,為數(shù)據(jù)更新命令分配游標;本步驟中,用戶或應用業(yè)務(wù)邏輯在需要對內(nèi)存數(shù)據(jù)庫中的數(shù)據(jù)進行更新時,向內(nèi)存數(shù)據(jù)庫發(fā)送數(shù)據(jù)更新命令,基于用戶或應用業(yè)務(wù)邏輯所提 交的數(shù)據(jù)更新命令總會有先后的順序,并依序執(zhí)行接收的數(shù)據(jù)更新名命令,因而,本發(fā)明實施例中,可以按照數(shù)據(jù)更新命令提交或接收的先后順序,為數(shù)據(jù)更新命令分配用于標識其執(zhí)行順序的游標。本發(fā)明實施例中,可以預先為該數(shù)據(jù)更新命令分配一個自增id,例如,可以按照接收到的數(shù)據(jù)更新命令的順序進行分配,id從I開始,最大為64位無符號長整型。較佳地,本發(fā)明實施例應用于異步提交系統(tǒng)中。本發(fā)明實施例中,游標信息為游標序列號。當然,實際應用中,游標信息也可以是其它的信息,只要保證為每個數(shù)據(jù)更新命令設(shè)置的游標信息互不相同即可,即只要能夠唯一標識數(shù)據(jù)更新命令即可。為數(shù)據(jù)更新命令分配游標包括判斷當前接收的數(shù)據(jù)更新命令是否為接收的第一條數(shù)據(jù)更新命令,如果是,為接收的數(shù)據(jù)更新命令分配游標序列號,并記錄分配的游標序列號信息;如果不是,將記錄的游標序列號進行累加,為接收數(shù)據(jù)更新命令設(shè)置累加的游標序列號,記錄累加的游標序列號信息。本步驟中,內(nèi)存數(shù)據(jù)庫判斷接收的數(shù)據(jù)更新命令是否為第一條數(shù)據(jù)更新命令,如果是,將初始游標序列號分配給該數(shù)據(jù)更新命令,并記錄該分配的游標序列號信息,后續(xù)如果接收到新數(shù)據(jù)更新命令,則將接收的前一數(shù)據(jù)更新命令的游標序列號進行累加,作為當前新接收數(shù)據(jù)更新命令的游標序列號。例如,將游標序列號依序加1,如果設(shè)置的第一條數(shù)據(jù)更新命令對應的初始游標序列號為1,則后續(xù)接收的數(shù)據(jù)更新命令對應的游標序列號,依序為2、3、4、…。當然,實際應用中,為數(shù)據(jù)更新命令分配游標也可以包括判斷AOF文件中是否存在寫入的數(shù)據(jù)更新命令,如果不存在,為接收的數(shù)據(jù)更新命令分配游標序列號;如果存在,獲取AOF文件中當前已寫入的數(shù)據(jù)更新命令的游標序列號信息,對獲取的游標序列號進行累加,為接收的數(shù)據(jù)更新命令設(shè)置累加的游標序列號。本步驟中,內(nèi)存數(shù)據(jù)庫在接收到數(shù)據(jù)更新命令時,查詢寫入磁盤的AOF文件中是否有寫入的數(shù)據(jù)更新命令,如果沒有,表明當前接收到的數(shù)據(jù)更新命令為第一條數(shù)據(jù)更新命令;如果寫入磁盤的AOF文件中有寫入的數(shù)據(jù)更新命令,則可以根據(jù)最近一次寫入的數(shù)據(jù)更新命令中攜帶的游標序列號信息,為當前接收到的數(shù)據(jù)更新命令設(shè)置相應的游標序列號。步驟102,將接收的數(shù)據(jù)更新命令以及分配的游標寫入AOF文件,并將AOF文件寫入磁盤;本步驟中,在AOF文件中,建立數(shù)據(jù)更新命令與游標的映射關(guān)系并存儲。將接收的數(shù)據(jù)更新命令順序?qū)懭氪疟P,并將順序值(游標序列號)從I開始,依序自增,并將依序自增的序號作為依序接收的數(shù)據(jù)更新命令的游標,從而形成一一映射關(guān)系。本發(fā)明實施例中,將數(shù)據(jù)更新命令傳遞給內(nèi)存數(shù)據(jù)庫寫入AOF文件的同時,將為該數(shù)據(jù)更新命令對應分配的游標信息傳遞給內(nèi)存數(shù)據(jù)庫。為了持久化存儲AOF文件,將生成的AOF文件實時寫入磁盤進行持久化存儲,以備后續(xù)進行數(shù)據(jù)恢復之用。步驟103,根據(jù)數(shù)據(jù)更新命令更新數(shù)據(jù),在更新數(shù)據(jù)成功后,按照預先設(shè)置的時間周期,將數(shù)據(jù)寫入磁盤中的數(shù)據(jù)文件,將為數(shù)據(jù)更新命令分配的游標寫入磁盤中的游標文件;本步驟中,內(nèi)存數(shù)據(jù)庫根據(jù)依序接收的數(shù)據(jù)更新命令,對內(nèi)存數(shù)據(jù)庫中的數(shù)據(jù)進行相應更新。內(nèi)存數(shù)據(jù)庫程序,例如,通過預先構(gòu)造數(shù)據(jù)結(jié)構(gòu)來將數(shù)據(jù)存儲到內(nèi)存數(shù)據(jù)庫的程序,在接收到數(shù)據(jù)更新命令時,對數(shù)據(jù)進行更新。本發(fā)明實施例中,在磁盤中預先設(shè)置有數(shù)據(jù)文件以及游標文件,內(nèi)存數(shù)據(jù)庫在更新數(shù)據(jù)成功后,按照預先設(shè)置的時間周期,將更新的內(nèi)存數(shù)據(jù)dump寫入磁盤中數(shù)據(jù)文件的同時,將當前該更新命令對應的游標值也同時dump寫入磁盤中的游標文件進行保存。 其中,將為數(shù)據(jù)更新命令分配的游標寫入磁盤中的游標文件包括獲取預先設(shè)置的時間周期內(nèi),更新數(shù)據(jù)成功對應的數(shù)據(jù)更新命令,將為所述更新數(shù)據(jù)成功對應的數(shù)據(jù)更新命令分配的游標寫入磁盤中的游標文件。較佳地,為了保持游標文件中存儲的游標信息的前后一致性,將為數(shù)據(jù)更新命令分配的游標寫入磁盤中的游標文件還可以包括讀取游標文件中最新存儲的游標序列號;判斷為數(shù)據(jù)更新命令分配的游標序列號是否大于游標文件中最新存儲的游標序列號,如果是,將為數(shù)據(jù)更新命令分配的游標寫入磁盤中的游標文件;否則,不作處理。本步驟中,寫入游標序列號時,需要對游標文件存儲的游標序列號進行一致性檢查,以避免不必要的處理流程,由于為數(shù)據(jù)更新命令分配的游標序列號依序遞增,因而,如果為數(shù)據(jù)更新命令分配的游標序列號大于游標文件中最新存儲的游標序列號,表明當前執(zhí)行的數(shù)據(jù)更新是在上一次的數(shù)據(jù)更新的基礎(chǔ)上執(zhí)行的,具有連續(xù)性;如果為數(shù)據(jù)更新命令分配的游標序列號小于或等于游標文件中最新存儲的游標序列號,例如,如果數(shù)據(jù)更新命令分配的游標序列號與存儲的游標序列號相同,或者,數(shù)據(jù)更新命令分配的游標序列號與存儲的游標序列號相差兩個以上累加單位,表明當前執(zhí)行的數(shù)據(jù)更新出現(xiàn)了異常,需要終止。舉例來說,假設(shè)內(nèi)存數(shù)據(jù)庫中存儲的數(shù)據(jù)為空,需要為內(nèi)存數(shù)據(jù)庫置入數(shù)據(jù)B,并執(zhí)行將數(shù)據(jù)B轉(zhuǎn)換為數(shù)據(jù)A的流程,則本發(fā)明實施例中,依序包含兩條數(shù)據(jù)更新命令,分別為初始化內(nèi)存數(shù)據(jù)庫的數(shù)據(jù)更新命令I(lǐng)以及將數(shù)據(jù)B轉(zhuǎn)換為數(shù)據(jù)A的數(shù)據(jù)更新命令2,在接收到數(shù)據(jù)更新命令I(lǐng)后,為數(shù)據(jù)更新命令I(lǐng)分配游標序列號1,接收到數(shù)據(jù)更新命令2,為數(shù)據(jù)更新命令2分配游標序列號2,并將接收的數(shù)據(jù)更新命令及其分配的游標序列號寫入磁盤中的AOF文件;執(zhí)行數(shù)據(jù)更新命令1,在內(nèi)存數(shù)據(jù)庫中寫入數(shù)據(jù)B,然后,執(zhí)行數(shù)據(jù)更新命令2,將內(nèi)存數(shù)據(jù)庫中寫入的數(shù)據(jù)B轉(zhuǎn)換為數(shù)據(jù)A。在預先設(shè)置的時間周期到時,將初始寫入的數(shù)據(jù)B以及轉(zhuǎn)換后生成的數(shù)據(jù)A寫入磁盤中的數(shù)據(jù)文件,將為數(shù)據(jù)更新命令I(lǐng)分配的游標序列號I以及為數(shù)據(jù)更新命令2分配的游標序列號2寫入磁盤中的游標文件。如果在預先設(shè)置的時間周期未到時,服務(wù)出現(xiàn)異常,例如,內(nèi)存數(shù)據(jù)庫斷電,則在AOF文件中,存儲有數(shù)據(jù)更新命令I(lǐng)以及數(shù)據(jù)更新命令2,并分別建立有數(shù)據(jù)更新命令I(lǐng)與游標序列號I、以及數(shù)據(jù)更新命令2與游標序列號2的映射關(guān)系,在數(shù)據(jù)文件中,未寫入任何數(shù)據(jù),在游標文件中,也未記錄任何游標序列號。較佳地,本發(fā)明實施例中,為了有效降低磁盤中持久化存儲的數(shù)據(jù)量,將數(shù)據(jù)寫入磁盤中的數(shù)據(jù)文件的步驟之后,可以進一步包括刪除數(shù)據(jù)文件中除最近更新數(shù)據(jù)外的其他數(shù)據(jù)。本步驟中,如前所述,對于數(shù)據(jù)文件中存儲有初始寫入的數(shù)據(jù)B以及轉(zhuǎn)換后生成的數(shù)據(jù)A的情形,由于轉(zhuǎn) 換后生成的數(shù)據(jù)A為最近更新數(shù)據(jù),則可以只保留轉(zhuǎn)換后生成的數(shù)據(jù)A,而刪除初始寫入的數(shù)據(jù)B。這樣,數(shù)據(jù)文件中只需存儲最后一次成功更新的數(shù)據(jù),從而有效降低了所需存儲的數(shù)據(jù)量。基于同樣的考慮,將為數(shù)據(jù)更新命令分配的游標寫入磁盤中的游標文件的步驟,也可以進一步包括存儲游標文件中最大的游標序列號,刪除游標文件中除最大游標序列號外的其他游標序列號。本步驟中,如前所述,對于游標文件中存儲有數(shù)據(jù)更新命令I(lǐng)以及數(shù)據(jù)更新命令2的情形,由于數(shù)據(jù)更新命令2為最近執(zhí)行的數(shù)據(jù)更新命令,則可以只保留最近執(zhí)行的數(shù)據(jù)更新命令2,而刪除數(shù)據(jù)更新命令I(lǐng)。這樣,游標文件中也只需存儲最后一次執(zhí)行成功的數(shù)據(jù)更新命令,也有效降低了所需存儲的數(shù)據(jù)量。步驟104,重啟服務(wù),加載磁盤數(shù)據(jù)文件中的數(shù)據(jù),獲取游標文件中順序位最高的游標,從存儲的AOF文件中,加載該游標對應的數(shù)據(jù)更新命令之后的數(shù)據(jù)更新命令。本步驟中,在將內(nèi)存數(shù)據(jù)更新命令dump寫入磁盤的同時,將當前該更新命令對應的游標序列號也同時dump到磁盤進行保存。當數(shù)據(jù)庫程序發(fā)生異常,例如,崩潰時,根據(jù)磁盤上保存的數(shù)據(jù)文件、AOF文件以及游標文件,即可安全地進行內(nèi)存數(shù)據(jù)庫中數(shù)據(jù)的接續(xù)更新和恢復。具體來說,讀取數(shù)據(jù)文件,獲取數(shù)據(jù)文件中最近更新的數(shù)據(jù),接著,從游標文件中,獲取游標文件中順序位最高的游標,即最大的游標序列號,根據(jù)該最大的游標序列號,查詢存儲的AOF文件,根據(jù)AOF文件中的映射關(guān)系,獲取最大的游標序列號對應的數(shù)據(jù)更新命令,對獲取的數(shù)據(jù)文件中最近更新的數(shù)據(jù),依序執(zhí)行最大的游標序列號對應的數(shù)據(jù)更新命令之后的數(shù)據(jù)更新命令,從而恢復出所需的數(shù)據(jù)。如前所述,如果AOF文件中存儲有數(shù)據(jù)更新命令I(lǐng)映射的游標序列號I、以及,數(shù)據(jù)更新命令2映射的游標序列號2 ;數(shù)據(jù)文件中存儲有初始寫入的數(shù)據(jù)B以及轉(zhuǎn)換后生成的數(shù)據(jù)A,或者,存儲有轉(zhuǎn)換后生成的數(shù)據(jù)A ;游標文件中存儲有游標序列號I以及游標序列號2,或者,存儲有游標序列號2,在服務(wù)異常的情況下,通過重啟服務(wù),需要恢復出服務(wù)異常前的數(shù)據(jù),則首先獲取數(shù)據(jù)文件中最近更新的數(shù)據(jù),即轉(zhuǎn)換后生成的數(shù)據(jù)A,接著,獲取獲取游標文件中順序位最高的游標,即游標序列號2,根據(jù)游標序列號2,查詢存儲的AOF文件,根據(jù)AOF文件中的映射關(guān)系,獲取游標序列號2對應的數(shù)據(jù)更新命令,即數(shù)據(jù)更新命令2,由于該數(shù)據(jù)更新命令2之后,沒有存儲其它順序位更高的數(shù)據(jù)更新命令,因而,無需對轉(zhuǎn)換后生成的數(shù)據(jù)A執(zhí)行數(shù)據(jù)更新,即恢復出的數(shù)據(jù)為轉(zhuǎn)換后生成的數(shù)據(jù)A。而如果AOF文件中存儲有數(shù)據(jù)更新命令I(lǐng)映射的游標序列號I、以及,數(shù)據(jù)更新命令2映射的游標序列號2 ;數(shù)據(jù)文件中存儲的數(shù)據(jù)為空;游標文件中存儲的游標序列號為空,表明在執(zhí)行數(shù)據(jù)更新命令I(lǐng)以及對數(shù)據(jù)B執(zhí)行數(shù)據(jù)更新命令2的過程中,服務(wù)發(fā)生異常,現(xiàn)有技術(shù)中,該服務(wù)發(fā)生異常時,數(shù)據(jù)B以及數(shù)據(jù)A將被丟棄,無法恢復,本發(fā)明實施例中,在服務(wù)異常的情況下,通過重啟服務(wù),可以恢復出服務(wù)異常前的數(shù)據(jù),首先獲取數(shù)據(jù)文件中最近更新的數(shù)據(jù)(無數(shù)據(jù)),接著,獲取獲取游標文件中順序位最高的游標(無游標序列號,例如,可以默認為0),則查詢存儲的AOF文件,獲取最低游標序列號對應的數(shù)據(jù)更新命令,即數(shù)據(jù)更新命令1,以及最高游標序列號對應的數(shù)據(jù)更新命令2,根據(jù)數(shù)據(jù)更新命令1,置入初始數(shù)據(jù)B,根據(jù)數(shù)據(jù)更新命令2,將置入的初始數(shù)據(jù)B經(jīng)過轉(zhuǎn)換處理,轉(zhuǎn)換為數(shù)據(jù)A,即可恢復數(shù)據(jù)為轉(zhuǎn)換后生成的數(shù)據(jù)A。圖2為本發(fā)明實施例內(nèi)存數(shù)據(jù)庫處理數(shù)據(jù)更新命令的流程示意圖。參見圖2,該流程包括步驟201,應用業(yè)務(wù)邏輯發(fā)送用于數(shù)據(jù)更新的數(shù)據(jù)更新命令;本步驟中,當需要進行數(shù)據(jù)更新時,向內(nèi)存數(shù)據(jù)庫發(fā)送數(shù)據(jù)更新命令。
      步驟202,接收數(shù)據(jù)更新命令,判斷是否接收成功,如果是,執(zhí)行步驟203,否則,等待接收下一數(shù)據(jù)更新命令;本步驟中,如果數(shù)據(jù)更新命令接收不成功,則繼續(xù)等待,以便接收下一數(shù)據(jù)更新命令。步驟203,為接收的數(shù)據(jù)更新命令進行游標分配;本步驟中,依據(jù)接收的數(shù)據(jù)更新命令,依序為接收的數(shù)據(jù)更新命令分配順序位依次增大的游標序列號。步驟204,將成功接收的數(shù)據(jù)更新命令寫入磁盤中的AOF文件;步驟205,進行數(shù)據(jù)更新命令處理,等待接收下一數(shù)據(jù)更新命令。本步驟中,根據(jù)數(shù)據(jù)更新命令,對數(shù)據(jù)進行相應更新,在更新成功后,當達到預先設(shè)置的時間周期時,將更新成功的數(shù)據(jù)寫入磁盤中的數(shù)據(jù)文件,并將該數(shù)據(jù)更新命令對應的游標序列號寫入磁盤中的游標文件。當然,實際應用中,也可以以更新成功的數(shù)據(jù)替換磁盤數(shù)據(jù)文件中存儲的數(shù)據(jù),并以該數(shù)據(jù)更新命令對應的游標序列號替換磁盤游標文件中存儲的游標序列號。圖3為本發(fā)明實施例內(nèi)恢復數(shù)據(jù)的流程示意圖。參見圖3,該流程包括步驟301,加載磁盤中存儲的數(shù)據(jù)文件中的數(shù)據(jù);本步驟中,加載數(shù)據(jù)文件中最近存儲的數(shù)據(jù)。步驟302,讀取磁盤游標文件中存儲的游標序列號;本步驟中,獲取游標文件中存儲的最大游標序列號。步驟303,按照讀取的游標序列號讀取AOF文件中未處理的數(shù)據(jù)更新命令,進行數(shù)據(jù)恢復;本步驟中,根據(jù)游標文件中存儲的最大游標序列號,獲取AOF文件中該最大游標序列號之后的數(shù)據(jù)更新命令,對加載的數(shù)據(jù)進行數(shù)據(jù)更新處理,從而恢復出所需的數(shù)據(jù)。步驟304,響應網(wǎng)絡(luò)查詢命令,輸出查詢命令對應的數(shù)據(jù)。本步驟中,在內(nèi)存數(shù)據(jù)庫中恢復出數(shù)據(jù)后,可以接收外部用戶的查詢命令,將查詢得到的數(shù)據(jù)向用戶返回,從而提供業(yè)務(wù)服務(wù)。實際應用中,為了實現(xiàn)內(nèi)存數(shù)據(jù)庫的多機冗余,還可以將數(shù)據(jù)更新命令接收、游標分配和數(shù)據(jù)持久化存儲機制單獨提取并存處在不同的物理設(shè)備中,從而基于冗余機制開發(fā)異步提交系統(tǒng)。由上述技術(shù)方案可見,本發(fā)明實施例的數(shù)據(jù)存儲方法,在接收到數(shù)據(jù)更新命令后,為數(shù)據(jù)更新命令分配游標,并在內(nèi)存數(shù)據(jù)庫中數(shù)據(jù)依據(jù)數(shù)據(jù)更新命令更新成功后,存儲該數(shù)據(jù)更新命令對應的游標信息以及更新的數(shù)據(jù),在進行數(shù)據(jù)恢復時,獲取最后更新成功的數(shù)據(jù),并依據(jù)該數(shù)據(jù)對應的游標信息,讀取AOF文件中該游標信息之后順序存儲的數(shù)據(jù)更新命令,對獲取的數(shù)據(jù)進行數(shù)據(jù)更新,從而恢復出數(shù)據(jù)。這樣,通過為數(shù)據(jù)更新命令分配游標并嚴格按照順序保存,在dump數(shù)據(jù)的同時,保存數(shù)據(jù)更新命令對應的游標值,實現(xiàn)數(shù)據(jù)增量更新,在數(shù)據(jù)恢復時,按照游標歷史值回跳游標,并重放數(shù)據(jù)更新命令來恢復內(nèi)存數(shù)據(jù),可以避免兩次時間周期之間,由于服務(wù)重啟造成的數(shù)據(jù)更新丟失問題,以及,AOF文件過大引起的數(shù)據(jù)恢復時間過長問題。具體來說,本發(fā)明實施例的技術(shù)方案,與Redis的AOF文件機制相比,不需要定期重寫AOF文件,對于游標序列號小于游標文件中所記錄的游標值的數(shù)據(jù)更新命令,可以直接刪除,例如,在系統(tǒng)實現(xiàn)時,可以將游標文件按照2G文件大小進 行拆分,并刪除更新時間較長的數(shù)據(jù)以及游標序列號較小的游標,這樣,減少了增量備份對磁盤的占用量,而且數(shù)據(jù)恢復時間短、速度快;而相較于Redis的snapshot機制,本發(fā)明實施例,由于dump時通過游標文件記錄了游標值,因而,在數(shù)據(jù)恢復時,只需要從游標值開始而無需從最初的游標值開始,重新進行數(shù)據(jù)更新命令的處理,即可恢復全部數(shù)據(jù),從而降低了恢復數(shù)據(jù)所需的時間,解決了兩次snapshot期間重啟服務(wù)造成的數(shù)據(jù)丟失問題,使得本發(fā)明實施例提出的異步提交系統(tǒng),在自媒體產(chǎn)品內(nèi)獲得相對廣泛的應用。圖4為本發(fā)明實施例的數(shù)據(jù)存儲系統(tǒng)結(jié)構(gòu)示意圖。參見圖4,該系統(tǒng)包括游標分配器、AOF文件存儲器、數(shù)據(jù)文件存儲器、游標文件存儲器以及數(shù)據(jù)恢復器,其中,游標分配器,用于接收數(shù)據(jù)更新命令,為數(shù)據(jù)更新命令分配游標;本發(fā)明實施例中,游標以游標序列號進行標識,按照接收的數(shù)據(jù)更新命令,依序遞
      士豳
      >曰οAOF文件存儲器,用于將接收的數(shù)據(jù)更新命令以及分配的游標寫入AOF文件,存儲寫入的AOF文件;數(shù)據(jù)文件存儲器,用于根據(jù)數(shù)據(jù)更新命令更新數(shù)據(jù),在更新數(shù)據(jù)成功后,按照預先設(shè)置的時間周期,存儲寫入的數(shù)據(jù)文件,向游標文件存儲器輸出觸發(fā)信息;游標文件存儲器,用于接收觸發(fā)信息,存儲將為數(shù)據(jù)更新命令分配的游標信息;數(shù)據(jù)恢復器,用于重啟服務(wù),加載磁盤中數(shù)據(jù)文件存儲器中的數(shù)據(jù),獲取游標文件存儲器中順序位最高的游標,從AOF文件存儲器存儲的AOF文件中,加載該游標對應的數(shù)據(jù)更新命令之后的數(shù)據(jù)更新命令。本發(fā)明實施例中,較佳地,AOF文件存儲器可以為一個或多個,如果為多個,則可以形成冗余配置,可以提高系統(tǒng)的可靠性。數(shù)據(jù)文件存儲器以及游標文件存儲器也可以分別為一個或多個。其中,游標分配器包括接收模塊、判斷模塊、分配模塊以及累加模塊(圖中未示出),其中,接收模塊,用于接收數(shù)據(jù)更新命令,輸出至判斷模塊;判斷模塊,用于判斷當前接收的數(shù)據(jù)更新命令是否為接收的第一條數(shù)據(jù)更新命令,如果是,輸出至分配模塊,如果不是,輸出至累加模塊;分配模塊,用于為接收的數(shù)據(jù)更新命令分配游標序列號,并記錄分配的游標序列
      號信息;累加模塊,用于將記錄的游標序列號進行累加,為接收數(shù)據(jù)更新命令設(shè)置累加的游標序列號,記錄累加的游標序列號信息。當然,實際應用中,游標分配器也可以包括接收模塊、判斷模塊、分配模塊、獲取模塊以及累加模塊(圖中未示出),其中,接收模塊,用于接收數(shù)據(jù)更新命令,輸出至判斷模塊;判斷模塊,用于判斷AOF文件中是否存在寫入的數(shù)據(jù)更新命令,如果不存在,通知分配模塊,如果存在,通知獲取模塊; 分配模塊,用于接收通知,為接收的數(shù)據(jù)更新命令分配游標序列號;獲取模塊,用于接收通知,獲取AOF文件中當前已寫入的數(shù)據(jù)更新命令的游標序列號信息;累加模塊,用于對獲取的游標序列號進行累加,為接收的數(shù)據(jù)更新命令設(shè)置累加的游標序列號。數(shù)據(jù)恢復器包括重啟模塊、數(shù)據(jù)文件讀取模塊、游標文件讀取模塊、查詢模塊以及更新模塊(圖中未示出),其中,重啟模塊,用于重啟服務(wù);數(shù)據(jù)文件讀取模塊,用于讀取數(shù)據(jù)文件存儲器中存儲的數(shù)據(jù)文件,獲取數(shù)據(jù)文件中最近更新的數(shù)據(jù);游標文件讀取模塊,用于從游標文件存儲器存儲的游標文件中,獲取游標文件中順序位最大的游標序列號;查詢模塊,用于根據(jù)該最大的游標序列號,查詢AOF文件存儲器中存儲的AOF文件,根據(jù)AOF文件中的映射關(guān)系,獲取最大的游標序列號對應的數(shù)據(jù)更新命令;更新模塊,用于對獲取的數(shù)據(jù)文件中最近更新的數(shù)據(jù),依序執(zhí)行最大的游標序列號對應的數(shù)據(jù)更新命令之后的數(shù)據(jù)更新命令。顯然,本領(lǐng)域技術(shù)人員可以對本發(fā)明進行各種改動和變型而不脫離本發(fā)明的精神和范圍。這樣,倘若對本發(fā)明的這些修改和變型屬于本發(fā)明權(quán)利要求及其等同技術(shù)的范圍之內(nèi),則本發(fā)明也包含這些改動和變型在內(nèi)。
      權(quán)利要求
      1.一種數(shù)據(jù)存儲方法,該方法包括 接收數(shù)據(jù)更新命令,為數(shù)據(jù)更新命令分配游標; 將接收的數(shù)據(jù)更新命令以及分配的游標寫入不斷添加模式AOF文件,并將AOF文件寫入磁盤; 根據(jù)數(shù)據(jù)更新命令更新數(shù)據(jù),在更新數(shù)據(jù)成功后,按照預先設(shè)置的時間周期,將數(shù)據(jù)寫入磁盤中的數(shù)據(jù)文件,將為數(shù)據(jù)更新命令分配的游標寫入磁盤中的游標文件; 重啟服務(wù),加載磁盤數(shù)據(jù)文件中的數(shù)據(jù),獲取游標文件中順序位最高的游標,從存儲的AOF文件中,加載該游標對應的數(shù)據(jù)更新命令之后的數(shù)據(jù)更新命令。
      2.根據(jù)權(quán)利要求I所述的方法,其中,所述為數(shù)據(jù)更新命令分配游標包括 判斷當前接收的數(shù)據(jù)更新命令是否為接收的第一條數(shù)據(jù)更新命令,如果是,為接收的數(shù)據(jù)更新命令分配游標序列號,并記錄分配的游標序列號信息;如果不是,將記錄的游標序列號進行累加,為接收數(shù)據(jù)更新命令設(shè)置累加的游標序列號,記錄累加的游標序列號信息。
      3.根據(jù)權(quán)利要求I所述的方法,其中,所述為數(shù)據(jù)更新命令分配游標包括 判斷AOF文件中是否存在寫入的數(shù)據(jù)更新命令,如果不存在,為接收的數(shù)據(jù)更新命令分配游標序列號;如果存在,獲取AOF文件中當前已寫入的數(shù)據(jù)更新命令的游標序列號信息,對獲取的游標序列號進行累加,為接收的數(shù)據(jù)更新命令設(shè)置累加的游標序列號。
      4.根據(jù)權(quán)利要求I至3任一項所述的方法,其中,所述將為數(shù)據(jù)更新命令分配的游標寫入磁盤中的游標文件包括 獲取預先設(shè)置的時間周期內(nèi),更新數(shù)據(jù)成功對應的數(shù)據(jù)更新命令,將為所述更新數(shù)據(jù)成功對應的數(shù)據(jù)更新命令分配的游標寫入磁盤中的游標文件。
      5.根據(jù)權(quán)利要求4所述的方法,其中,所述將為數(shù)據(jù)更新命令分配的游標寫入磁盤中的游標文件進一步包括 讀取游標文件中最新存儲的游標序列號; 判斷為數(shù)據(jù)更新命令分配的游標序列號是否大于游標文件中最新存儲的游標序列號,如果是,將為數(shù)據(jù)更新命令分配的游標寫入磁盤中的游標文件;否則,不作處理。
      6.根據(jù)權(quán)利要求I至3任一項所述的方法,其中,所述將數(shù)據(jù)寫入磁盤中的數(shù)據(jù)文件之后,進一步包括 刪除數(shù)據(jù)文件中除最近更新數(shù)據(jù)外的其他數(shù)據(jù)。
      7.根據(jù)權(quán)利要求I至3任一項所述的方法,其中,所述將為數(shù)據(jù)更新命令分配的游標寫入磁盤中的游標文件之后,進一步包括 存儲游標文件中最大的游標序列號,刪除游標文件中除最大游標序列號外的其他游標序列號。
      8.根據(jù)權(quán)利要求I至3任一項所述的方法,其中,所述加載磁盤數(shù)據(jù)文件中的數(shù)據(jù),獲取游標文件中順序位最高的游標,從存儲的AOF文件中,加載該游標對應的數(shù)據(jù)更新命令之后的數(shù)據(jù)更新命令包括 讀取數(shù)據(jù)文件,獲取數(shù)據(jù)文件中最近更新的數(shù)據(jù); 從游標文件中,獲取游標文件中順序位最大的游標序列號; 根據(jù)該最大的游標序列號,查詢存儲的AOF文件,根據(jù)AOF文件中的映射關(guān)系,獲取最大的游標序列號對應的數(shù)據(jù)更新命令;對獲取的數(shù)據(jù)文件中最近更新的數(shù)據(jù),依序執(zhí)行最大的游標序列號對應的數(shù)據(jù)更新命令之后的數(shù)據(jù)更新命令。
      9.一種數(shù)據(jù)存儲系統(tǒng),其特征在于,該數(shù)據(jù)存儲系統(tǒng)包括游標分配器、不斷添加模式AOF文件存儲器、數(shù)據(jù)文件存儲器、游標文件存儲器以及數(shù)據(jù)恢復器,其中, 游標分配器,用于接收數(shù)據(jù)更新命令,為數(shù)據(jù)更新命令分配游標; AOF文件存儲器,用于將接收的數(shù)據(jù)更新命令以及分配的游標寫入AOF文件,存儲寫入的AOF文件; 數(shù)據(jù)文件存儲器,用于根據(jù)數(shù)據(jù)更新命令更新數(shù)據(jù),在更新數(shù)據(jù)成功后,按照預先設(shè)置的時間周期,存儲寫入的數(shù)據(jù)文件,向游標文件存儲器輸出觸發(fā)信息; 游標文件存儲器,用于接收觸發(fā)信息,存儲將為數(shù)據(jù)更新命令分配的游標信息; 數(shù)據(jù)恢復器,用于重啟服務(wù),加載磁盤中數(shù)據(jù)文件存儲器中的數(shù)據(jù),獲取游標文件存儲器中順序位最高的游標,從AOF文件存儲器存儲的AOF文件中,加載該游標對應的數(shù)據(jù)更新命令之后的數(shù)據(jù)更新命令。
      10.根據(jù)權(quán)利要求9所述的數(shù)據(jù)存儲系統(tǒng),其特征在于,所述AOF文件存儲器、數(shù)據(jù)文件存儲器以及游標文件存儲器分別為一個或多個。
      11.根據(jù)權(quán)利要求9或10所述的數(shù)據(jù)存儲系統(tǒng),其特征在于,所述游標分配器包括接收模塊、判斷模塊、分配模塊以及累加模塊,其中, 接收模塊,用于接收數(shù)據(jù)更新命令,輸出至判斷模塊; 判斷模塊,用于判斷當前接收的數(shù)據(jù)更新命令是否為接收的第一條數(shù)據(jù)更新命令,如果是,輸出至分配模塊,如果不是,輸出至累加模塊; 分配模塊,用于為接收的數(shù)據(jù)更新命令分配游標序列號,并記錄分配的游標序列號信息; 累加模塊,用于將記錄的游標序列號進行累加,為接收數(shù)據(jù)更新命令設(shè)置累加的游標序列號,記錄累加的游標序列號信息。
      12.根據(jù)權(quán)利要求9或10所述的數(shù)據(jù)存儲系統(tǒng),其特征在于,所述游標分配器包括接收模塊、判斷模塊、分配模塊、獲取模塊以及累加模塊,其中, 接收模塊,用于接收數(shù)據(jù)更新命令,輸出至判斷模塊; 判斷模塊,用于判斷AOF文件中是否存在寫入的數(shù)據(jù)更新命令,如果不存在,通知分配模塊,如果存在,通知獲取模塊; 分配模塊,用于接收通知,為接收的數(shù)據(jù)更新命令分配游標序列號; 獲取模塊,用于接收通知,獲取AOF文件中當前已寫入的數(shù)據(jù)更新命令的游標序列號信息; 累加模塊,用于對獲取的游標序列號進行累加,為接收的數(shù)據(jù)更新命令設(shè)置累加的游標序列號。
      13.根據(jù)權(quán)利要求9或10所述的數(shù)據(jù)存儲系統(tǒng),其特征在于,所述數(shù)據(jù)恢復器包括重啟模塊、數(shù)據(jù)文件讀取模塊、游標文件讀取模塊、查詢模塊以及更新模塊,其中, 重啟模塊,用于重啟服務(wù); 數(shù)據(jù)文件讀取模塊,用于讀取數(shù)據(jù)文件存儲器中存儲的數(shù)據(jù)文件,獲取數(shù)據(jù)文件中最近更新的數(shù)據(jù);游標文件讀取模塊,用于從游標文件存儲器存儲的游標文件中,獲取游標文件中順序位最大的游標序列號; 查詢模塊,用于根據(jù)該最大的游標序列號,查詢AOF文件存儲器中存儲的AOF文件,根據(jù)AOF文件中的映射關(guān)系,獲取最大的游標序列號對應的數(shù)據(jù)更新命令; 更新模塊,用于對獲取的數(shù)據(jù)文件中最近更新的數(shù)據(jù),依序執(zhí)行最大的游標序列號對 應的數(shù)據(jù)更新命令之后的數(shù)據(jù)更新命令。
      全文摘要
      本發(fā)明公開了一種數(shù)據(jù)存儲方法及數(shù)據(jù)存儲系統(tǒng)。該方法包括接收數(shù)據(jù)更新命令,為數(shù)據(jù)更新命令分配游標;將接收的數(shù)據(jù)更新命令以及分配的游標寫入不斷添加模式AOF文件,并將AOF文件寫入磁盤;根據(jù)數(shù)據(jù)更新命令更新數(shù)據(jù),在更新數(shù)據(jù)成功后,按照預先設(shè)置的時間周期,將數(shù)據(jù)寫入磁盤中的數(shù)據(jù)文件,將為數(shù)據(jù)更新命令分配的游標寫入磁盤中的游標文件;重啟服務(wù),加載磁盤數(shù)據(jù)文件中的數(shù)據(jù),獲取游標文件中順序位最高的游標,從存儲的AOF文件中,加載該游標對應的數(shù)據(jù)更新命令之后的數(shù)據(jù)更新命令。應用本發(fā)明,可以降低數(shù)據(jù)恢復所需的時間、避免數(shù)據(jù)丟失。
      文檔編號G06F9/445GK102902561SQ201210339989
      公開日2013年1月30日 申請日期2012年9月13日 優(yōu)先權(quán)日2012年9月13日
      發(fā)明者湯曉剛 申請人:新浪網(wǎng)技術(shù)(中國)有限公司
      網(wǎng)友詢問留言 已有0條留言
      • 還沒有人留言評論。精彩留言會獲得點贊!
      1