本發(fā)明涉及電子
技術(shù)領(lǐng)域:
,尤其涉及一種存儲方法、服務(wù)器及存儲控制器。
背景技術(shù):
:鍵值(Key-Value,簡稱KV)數(shù)據(jù)存儲,其數(shù)據(jù)按照鍵值對的形式進(jìn)行組織、索引和存儲。它具有存儲語義簡單、存儲系統(tǒng)擴(kuò)展性好、數(shù)據(jù)查詢速度快、數(shù)據(jù)存儲量大的特點。存儲系統(tǒng)中使用的存儲協(xié)議有很多,以NVMe(Non-VolatileMemoryExpress,非易失性存儲器標(biāo)準(zhǔn))協(xié)議為例:使用NVMe協(xié)議的存儲系統(tǒng)能夠減少通用IO(Input/Output,輸入/輸出)的調(diào)度、SCSI(SmallComputerSystemInterface,小型計算機(jī)系統(tǒng)接口)較高層和SCSI中間層,IO路徑短、時延低、并發(fā)處理能力強。鍵值存儲和NVMe協(xié)議結(jié)合起來,將使存儲系統(tǒng)同時具備這兩者的優(yōu)勢。鍵值存儲和NVMe協(xié)議的結(jié)合方式是由NVMe協(xié)議攜帶鍵值存儲數(shù)據(jù)包進(jìn)行傳輸。例如,可將NVMe的數(shù)據(jù)凈荷的指令序列替換為鍵值數(shù)據(jù)存儲包的指令序列。鍵值存儲目前主要的實現(xiàn)方式有2種方法,一種方法是硬件使用SCSI設(shè)備,SCSI設(shè)備通過SCSI底層驅(qū)動、SCSI中層、SCSI上層、IO調(diào)度層和塊設(shè)備層對外提供塊設(shè)備服務(wù)。軟件在塊設(shè)備層或者文件系統(tǒng)之上建立中間件,中間件負(fù)責(zé)完成鍵值操作和塊設(shè)備或文件系統(tǒng)操作的轉(zhuǎn)換,從而對用戶空間的應(yīng)用提供鍵值存儲的服務(wù)。然而,上述方法需要多層存儲協(xié)議棧進(jìn)行轉(zhuǎn)換,IO路徑長,時延長,鍵值存儲效率較低。另一種方法是硬件使用支持鍵值存儲的設(shè)備,鍵值存儲設(shè)備通過鍵值存儲驅(qū)動層與中間件進(jìn)行通信,中間件將用戶存儲轉(zhuǎn)換為鍵值存儲操作,從而對用戶空間的應(yīng)用提供鍵值存儲服務(wù)。然而,鍵值存儲設(shè)備無法支持傳統(tǒng)塊設(shè)備服務(wù),應(yīng)用范圍具有局限性。技術(shù)實現(xiàn)要素:本發(fā)明提供一種存儲方法、服務(wù)器及存儲控制器,可縮短IO路徑、減少時延,減少在鍵值操作和塊設(shè)備或文件系統(tǒng)操作的轉(zhuǎn)換的過程。本發(fā)明第一方面提供一種存儲方法,利用協(xié)議指向的數(shù)據(jù)段來傳輸鍵值存儲的存儲請求隊列,存儲請求隊列中包含了存儲操作請求的操作類型、存儲指令序列的內(nèi)存地址、存儲類型標(biāo)識,存儲類型標(biāo)識用于指示存儲操作請求的存儲類型為鍵值存儲或者塊存儲,以使存儲控制器根據(jù)存儲請求隊列執(zhí)行相應(yīng)的存儲操作,減少多層存儲協(xié)議棧之間的轉(zhuǎn)換,縮短IO路徑和時延,提高鍵值存儲效率。此外,借助標(biāo)準(zhǔn)存儲協(xié)議,使得存儲控制系統(tǒng)或者存儲控制器同時具有鍵值存儲和塊存儲的特性??蛇x的,存儲類型標(biāo)識用于指示所述存儲操作請求的存儲類型為鍵值存儲時,所述存儲類型標(biāo)識為預(yù)設(shè)無效值??蛇x的,所述存儲類型標(biāo)識用于指示所述存儲操作請求的存儲類型為鍵值存儲時,所述存儲類型標(biāo)識根據(jù)存儲請求隊列中標(biāo)識的存儲數(shù)據(jù)在所述存儲中需要存儲的位置與所述存儲的數(shù)據(jù)的長度的和是否大于所述存儲控制器的容量確定。例如,存儲介質(zhì)的存儲總?cè)萘繛閄時,在存儲請求隊列的SLBA字段填邏輯區(qū)塊起始地址為Y,NLB字段填邏輯塊的數(shù)量為Z,當(dāng)Y+Z>X時,即表示Y和Z填入的是無效值,也就是操作的數(shù)據(jù)超出后端存儲介質(zhì)的容量時,即認(rèn)為是無效值??蛇x的,存儲操作請求的操作類型為存儲數(shù)據(jù)、讀取數(shù)據(jù)、刪除數(shù)據(jù)以及廢棄數(shù)據(jù)中的任一種??蛇x的,當(dāng)所述存儲操作請求用于請求鍵值的存儲操作、所述存儲操作請求的操作類型為讀取數(shù)據(jù)時,服務(wù)器根據(jù)所述存儲操作請求獲取鍵值長度,根據(jù)所述鍵值長度生成存儲指令序列??蛇x的,當(dāng)所述存儲操作請求用于請求至少兩個鍵值的存儲操作時,則生成的存儲指令序列包括至少兩個鍵值的子存儲指令序列,則服務(wù)器確定所述存儲操作請求的操作類型、存儲類型標(biāo)識,針對所述至少兩個鍵值的子存儲指令序列確定對應(yīng)的內(nèi)存地址,以執(zhí)行聚合存儲操作。可選的,存儲控制器針對存儲指令序列執(zhí)行相應(yīng)的存儲操作之后,向服務(wù)器返回操作狀態(tài)信息,以指示所述存儲控制器執(zhí)行所述相應(yīng)的存儲操作的狀態(tài)。本發(fā)明第二方面提供一種存儲方法,存儲控制器在接收到服務(wù)器發(fā)送的存儲請求隊列后,通過存儲請求隊列攜帶的存儲類型標(biāo)識判斷存儲操作請求的存儲類型為鍵值存儲或者塊存儲,再根據(jù)存儲指令序列的內(nèi)存地址、存儲操作請求的操作類型以及存儲類型標(biāo)識執(zhí)行相應(yīng)的存儲操作,使得存儲控制系統(tǒng)或者存儲控制器同時具有鍵值存儲和塊存儲的特性??蛇x的,存儲類型標(biāo)識用于指示所述存儲操作請求的存儲類型為鍵值存儲時,所述存儲類型標(biāo)識為預(yù)設(shè)無效值??蛇x的,存儲類型標(biāo)識用于指示所述存儲操作請求的存儲類型為鍵值存儲時,所述存儲類型標(biāo)識根據(jù)存儲請求隊列中標(biāo)識的存儲數(shù)據(jù)在所述存儲中需要存儲的位置與所述存儲的數(shù)據(jù)的長度的和是否大于所述存儲控制器的容量確定。例如,存儲介質(zhì)的存儲總?cè)萘繛閄時,在存儲請求隊列的SLBA字段填邏輯區(qū)塊起始地址為Y,NLB字段填邏輯塊的數(shù)量為Z,當(dāng)Y+Z>X時,即表示Y和Z填入的是無效值,也就是操作的數(shù)據(jù)超出后端存儲介質(zhì)的容量時,即認(rèn)為是無效值??蛇x的,存儲操作請求的操作類型為存儲數(shù)據(jù)、讀取數(shù)據(jù)、刪除數(shù)據(jù)以及廢棄數(shù)據(jù)中的任一種??蛇x的,當(dāng)存儲控制器根據(jù)所述存儲類型標(biāo)識確定所述存儲操作請求的存儲類型為鍵值存儲時,存儲控制器根據(jù)所述存儲指令序列的內(nèi)存地址獲取所述存儲指令序列,再根據(jù)所述存儲操作請求的操作類型對所述存儲指令序列執(zhí)行相應(yīng)的鍵值存儲操作。可選的,當(dāng)存儲控制器根據(jù)所述存儲類型標(biāo)識確定所述存儲操作請求的存儲類型為塊存儲時,存儲控制器根據(jù)所述存儲指令序列的內(nèi)存地址獲取所述存儲指令序列,再根據(jù)所述存儲操作請求的操作類型對所述存儲指令序列執(zhí)行相應(yīng)的塊存儲操作??蛇x的,存儲控制器針對存儲指令序列執(zhí)行相應(yīng)的存儲操作之后,向服務(wù)器輸出操作狀態(tài)信息,以指示所述存儲控制器執(zhí)行所述相應(yīng)的存儲操作的狀態(tài)。本發(fā)明第三方面提供了一種服務(wù)器,該服務(wù)器用于根據(jù)存儲操作請求的相關(guān)參數(shù)生成存儲指令序列以及存儲請求隊列,該服務(wù)器包括了第一方面提供的存儲方法的至少一個模塊及單元。本發(fā)明第四方面提供了一種服務(wù)器,該服務(wù)器的結(jié)構(gòu)中包括處理器,處理器被配置為支持該服務(wù)器執(zhí)行第一方面提供的存儲方法中相應(yīng)功能。處理器用于根據(jù)存儲操作請求的相關(guān)參數(shù)生成存儲指令序列以及存儲請求隊列。該服務(wù)器還包括存儲器,存儲器用于與處理器耦合,其保存該服務(wù)器必要的程序指令和數(shù)據(jù)。該服務(wù)器還包括通信總線以及通信接口,通信總線用于實現(xiàn)存儲器和處理器之間的連接通信。通信接口用于該服務(wù)器與存儲控制器通信。本發(fā)明第五方面提供了一種存儲控制器,該存儲控制器用于根據(jù)服務(wù)器發(fā)送的存儲請求隊列執(zhí)行相應(yīng)的存儲操作。該存儲控制器包括了第二方面提供的存儲方法的至少一個模塊及單元。本發(fā)明第六方面提供了一種存儲控制器,該存儲控制器的結(jié)構(gòu)中包括命令處理單元、操作處理單元、鍵值存儲處理單元以及存儲控制單元,用于執(zhí)行第二方面提供的存儲方法中相應(yīng)功能。采用本發(fā)明,利用協(xié)議指向的數(shù)據(jù)段來傳輸鍵值存儲的存儲請求隊列,存儲請求隊列中包含了存儲操作請求的操作類型、存儲指令序列的內(nèi)存地址、存儲類型標(biāo)識,存儲類型標(biāo)識用于指示存儲操作請求的存儲類型為鍵值存儲或者塊存儲,以使存儲控制器根據(jù)存儲請求隊列執(zhí)行相應(yīng)的存儲操作,減少多層存儲協(xié)議棧之間的轉(zhuǎn)換,縮短IO路徑和時延,提高鍵值存儲效率。此外,借助標(biāo)準(zhǔn)存儲協(xié)議,使得存儲控制系統(tǒng)或者存儲控制器同時具有鍵值存儲和塊存儲的特性。附圖說明為了更清楚地說明本發(fā)明實施例的技術(shù)方案,下面將對實施例描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖是本發(fā)明的一些實施例,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動性的前提下,還可以根據(jù)這些附圖獲得其他的附圖。圖1(a)是本發(fā)明實施例的服務(wù)器及存儲控制器的一實施例的結(jié)構(gòu)示意圖;圖1(b)是本發(fā)明實施例的服務(wù)器及存儲控制器的另一實施例的結(jié)構(gòu)示意圖;圖1(c-1)是本發(fā)明實施例提供的SCSI協(xié)議中對塊設(shè)備操作的指令碼定義示意圖;圖1(c-2)是本發(fā)明實施例提供的SCSI協(xié)議中對塊設(shè)備操作的指令碼定義示意圖;圖1(d)是本發(fā)明實施例提供的SCSIREAD(12)指令定義示意圖;圖2(a)是本發(fā)明實施例的一種存儲方法的一實施例的流程示意圖;圖2(b)是本發(fā)明一實施例提供的一種存儲指令序列格式示意圖;圖2(c)是本發(fā)明一實施例提供的NVMe協(xié)議中IO操作相關(guān)的指令碼示意圖;圖2(d)是本發(fā)明一實施例提供的存儲請求隊列示意圖;圖3(a)是本發(fā)明實施例的一種存儲方法的另一實施例的流程示意圖;圖3(b)是本發(fā)明另一實施例提供的存儲請求隊列示意圖;圖4(a)是本發(fā)明實施例的一種存儲方法的另一實施例的流程示意圖;圖4(b)是本發(fā)明另一實施例提供的存儲請求隊列示意圖;圖4(c)是本發(fā)明另一實施例提供的存儲請求隊列示意圖;圖5(a)是本發(fā)明實施例的一種存儲方法的另一實施例的流程示意圖;圖5(b)是本發(fā)明另一實施例提供的存儲請求隊列示意圖;圖5(c)是本發(fā)明另一實施例提供的存儲請求隊列示意圖;圖6(a)是本發(fā)明實施例的一種存儲方法的另一實施例的流程示意圖;圖6(b)是本發(fā)明另一實施例提供的SGL表定義格式示意圖;圖6(c)是本發(fā)明另一實施例提供的存儲請求隊列示意圖;圖7(a)是本發(fā)明實施例的一種存儲方法的另一實施例的流程示意圖;圖7(b)是本發(fā)明另一實施例提供的NVMe存儲指令序列示意圖;圖8是本發(fā)明實施例的服務(wù)器的另一實施例的結(jié)構(gòu)示意圖;圖9是本發(fā)明實施例的存儲控制器的另一實施例的結(jié)構(gòu)示意圖。具體實施方式下面將結(jié)合本發(fā)明實施例中的附圖,對本發(fā)明實施例中的技術(shù)方案進(jìn)行清楚、完整地描述,顯然,所描述的實施例是本發(fā)明一部分實施例,而不是全部的實施例?;诒景l(fā)明中的實施例,本領(lǐng)域普通技術(shù)人員在沒有作出創(chuàng)造性勞動前提下所獲得的所有其他實施例,都屬于本發(fā)明保護(hù)的范圍。采用本發(fā)明,可減少多層存儲協(xié)議棧之間的轉(zhuǎn)換,縮短IO路徑和時延,提高鍵值存儲效率。本發(fā)明的說明書和權(quán)利要求書及上述附圖中的術(shù)語“第一”、“第二”、“第三”和“第四”等是用于區(qū)別不同對象,而不是用于描述特定順序。此外,術(shù)語“包括”和“具有”以及它們?nèi)魏巫冃?,意圖在于覆蓋不排他的包含。例如包含了一系列步驟或單元的過程、方法、系統(tǒng)、產(chǎn)品或設(shè)備沒有限定于已列出的步驟或單元,而是可選地還包括沒有列出的步驟或單元,或可選地還包括對于這些過程、方法、產(chǎn)品或設(shè)備固有的其它步驟或單元。本發(fā)明實施例利用NVMe協(xié)議SubmissionQueueEntry(提交隊列條目)中PRP(PhysicalRegionPage,頁物理區(qū)域)或者SGL(ScatterGatherList,聚散表)指向的數(shù)據(jù)段來傳輸鍵值存儲的數(shù)據(jù)包,這個數(shù)據(jù)包中包含了鍵值存儲的操作類型(例如操作碼)、存儲指令序列的內(nèi)存地址(存儲指令序列的內(nèi)存地址包括如Value或者Value存放的地址、Key或者Key存放的地址等信息)、存儲類型標(biāo)識(例如設(shè)置SubmissionQueueEntry中SLBA字段和NLB字段為無效值,表示當(dāng)前SubmissionQueueEntry中定義的操作是鍵值存儲操作)。當(dāng)存儲控制器分析SubmissionQueueEntry中的SLBA和NLB字段為無效值時按鍵值存儲流程處理。值得說明的是,鍵值存儲可以擴(kuò)展到多種存儲協(xié)議上,包括但不限于NVMe、SCSI等其他存儲協(xié)議,本實施例則以NVMe協(xié)議進(jìn)行舉例說明。圖1(a)和圖1(b)是本發(fā)明實施例的服務(wù)器及存儲控制器的結(jié)構(gòu)示意圖。服務(wù)器和控制器的連接方式包括但不限于PCIe(PCI-Express,最新的總線和接口標(biāo)準(zhǔn))、SAS(StatisticalAnalysisSystem,統(tǒng)計分析軟件)、SATA(SerialAdvancedTechnologyAttachment,串行高級技術(shù)附件)、以太等其他網(wǎng)絡(luò)連接方式。主機(jī)和控制器間指令和數(shù)據(jù)的傳輸方式包括但不限于DMA(DirectMemoryAccess,直接數(shù)據(jù)存取)、RDMA(RemoteDirectMemoryAccess,遠(yuǎn)程直接數(shù)據(jù)存取)等其他傳輸方式。服務(wù)器包括底板,底板上安裝有處理器、內(nèi)存、橋片等芯片,用于對其他擴(kuò)展設(shè)備進(jìn)行控制,實現(xiàn)服務(wù)器的功能。具體地,服務(wù)器用于獲取存儲操作請求,根據(jù)存儲操作請求生成存儲指令序列,并確定存儲操作請求的操作類型、存儲類型標(biāo)識以及存儲指令序列的內(nèi)存地址,再根據(jù)存儲操作請求的操作類型、存儲類型標(biāo)識以及存儲指令序列的內(nèi)存地址生成存儲請求隊列,最后將存儲請求隊列至存儲控制器。如圖1(a)所示,服務(wù)器和存儲控制器的連接方式為PCIe,本發(fā)明實施例的圖2至圖7參照圖1(a)所示的服務(wù)器和存儲控制器的連接方式進(jìn)行實施。服務(wù)器包括存儲器、處理器、通信總線、橋片以及通信接口。存儲器存儲程序代碼,處理器調(diào)用存儲器中存儲的程序代碼,用于執(zhí)行圖2至圖7所示的存儲方法,通信接口用于實現(xiàn)服務(wù)器與存儲控制器之間的通信,通信總線用于實現(xiàn)存儲器以及處理器之間的連接通信。處理器包括NVMe驅(qū)動層、應(yīng)用模塊、中間件、傳統(tǒng)應(yīng)用模塊、文件系統(tǒng)以及塊層。應(yīng)用模塊,為服務(wù)器應(yīng)用程序或者是存儲客戶端軟件。傳統(tǒng)應(yīng)用模塊,為傳統(tǒng)文件系統(tǒng)或者塊設(shè)備接口的服務(wù)器應(yīng)用程序。中間件,為鍵值存儲中間件,對服務(wù)器應(yīng)用提供鍵值存儲接口,并將存儲請求傳遞給NVMe驅(qū)動層。中間件可以將多個鍵合并,通過設(shè)備驅(qū)動層接口一次傳遞到設(shè)備驅(qū)動層。文件系統(tǒng),例如EXT3(ThirdExtendedFilesystem,第三代擴(kuò)展文件系統(tǒng))、EXT4(FourthExtendedFilesystem,第四代擴(kuò)展文件系統(tǒng))、FAT32(Windows系統(tǒng)硬盤分區(qū)格式的一種)等;塊層:操作系統(tǒng)對塊存儲設(shè)備的抽象層,一般文件系統(tǒng)都構(gòu)建于這層之上;NVMe驅(qū)動層:服務(wù)器操作系統(tǒng)通過驅(qū)動軟件和NVMe存儲設(shè)備進(jìn)行數(shù)據(jù)傳輸和命令交互。NVMe驅(qū)動層包括NVMe命令轉(zhuǎn)換模塊。NVMe命令轉(zhuǎn)換模塊:將存放鍵值存儲的數(shù)據(jù)的內(nèi)存地址填入SubmissionQueueEntry的PRP或者SGL,設(shè)置SLBA(StartingLBA,邏輯區(qū)塊起始地址)和NLB(NumberofLogicalBlocks,邏輯塊的數(shù)量)字段為無效值,并將SubmissionQueueEntry提交給NVMe驅(qū)動層下發(fā)給存儲控制器。存儲控制器(對控制器下連接的存儲設(shè)備進(jìn)行讀寫等操作)也是一個芯片,如FPGA(Field-ProgrammableGateArray,即現(xiàn)場可編程門陣列)、ASIC(ApplicationSpecificIntegratedCircuit,集成電路)等,通過對這個芯片進(jìn)行編程來完成接收服務(wù)器的讀寫請求,并對存儲控制器下連接中的存儲設(shè)備進(jìn)行各種訪問及控制。支持此方式的存儲控制器或者存儲系統(tǒng)可同時提供塊存儲和鍵值存儲兩種方式。存儲控制器為支持NVMe協(xié)議的存儲控制器,控制器通過PCIe總線和服務(wù)器相連。具體地,存儲控制器用于獲取服務(wù)器發(fā)送的存儲請求隊列,根據(jù)存儲請求隊列獲取存儲指令序列的內(nèi)存地址、存儲操作請求的操作類型以及存儲類型標(biāo)識,識別存儲類型標(biāo)識,并根據(jù)存儲指令序列的內(nèi)存地址、存儲操作請求的操作類型以及存儲類型標(biāo)識執(zhí)行相應(yīng)的存儲操作。如圖1(a)所示,存儲控制器包括NVMe命令處理單元、鍵值存儲處理單元、NVMe操作處理單元以及存儲控制單元。NVMe命令處理單元,用于分析存儲控制器接收到的存儲請求隊列中的存儲類型標(biāo)識,判斷SLBA和NLB字段的有效性,無效時將存儲請求隊列分發(fā)給鍵值存儲處理單元,有效時分發(fā)給NVMe操作處理單元。鍵值存儲處理單元,處理全部的鍵值存儲操作,并將處理后的狀態(tài)提交給存儲控制單元。NVMe操作處理單元,處理標(biāo)準(zhǔn)NVMe協(xié)議操作請求,即塊存儲操作,并將處理后的狀態(tài)提交給存儲控制單元。存儲控制單元,將前述單元提交的狀態(tài)轉(zhuǎn)換為對后端存儲設(shè)備的操作,并將操作結(jié)果反饋給前述單元。存儲介質(zhì)包括DRAM(DynamicRandomAccessMemory,動態(tài)隨機(jī)存取存儲器)、NVRAM(Non-VolatileRandomAccessMemory,非易失性隨機(jī)訪問存儲器)、NAND閃存或者其他存儲器件??蛇x的,如圖1(b)所示,服務(wù)器和存儲控制器的連接方式還可為SAS,服務(wù)器和存儲控制器的交互以及各自的實施方式可參照圖1(a)所示的服務(wù)器和存儲控制器的實施例,在本發(fā)明實施例中則不再贅述。圖1(b)所示的服務(wù)器的應(yīng)用模塊、傳統(tǒng)應(yīng)用模塊、中間件、文件系統(tǒng)與塊層的功能和圖1(a)中服務(wù)器的對應(yīng)模塊的功能相同。除此之外,服務(wù)器還包括SCSI上層、SCSI中層。SCSI層,處理SCSI事務(wù)的軟件層,包括SCSI上層、SCSI中層和SCSI下層。SCSI設(shè)備驅(qū)動,位于SCSI下層,負(fù)責(zé)將SCSI請求提交給存儲控制器,完成后存儲控制器間的控制和數(shù)據(jù)交互操作。圖1(b)所示的服務(wù)器的命令轉(zhuǎn)換模塊10110位于SCSI設(shè)備驅(qū)動層,用于將鍵值存儲請求的操作碼擴(kuò)展到SCSI協(xié)議上,并提給SCSI設(shè)備驅(qū)動發(fā)送給存儲控制器。圖1(b)所示的存儲控制器的鍵值存儲處理單元和存儲控制單元與圖1(a)中存儲控制器對應(yīng)單元的功能相同。對于圖1(b)所示的存儲控制器的命令處理單元,分析SCSI請求中的指令碼,判斷是將指令提交給鍵值處理單元還是SCSI處理單元。圖1(b)所示的存儲控制器的SCSI處理單元,處理除鍵值存儲命令外的其他標(biāo)準(zhǔn)SCSI命令。參見圖1(c)和圖1(d),圖1(c)是本發(fā)明實施例提供的SCSI協(xié)議中對塊設(shè)備操作的指令碼定義示意圖,圖1(d)是本發(fā)明實施例提供的SCSIREAD(12)指令定義示意圖。其中,圖1(c)分為圖1(c-1)和圖1(c-2)。以SCSIREAD(12)指令為例:在執(zhí)行鍵值存儲操作時將LOCGICALBLOCKADDRESS字段和TRANSFERLENGTH字段填為預(yù)設(shè)無效值(預(yù)設(shè)無效值例如為全F)表示當(dāng)前操作不是塊存儲操作,而是鍵值存儲操作。鍵值存儲的操作碼與操作流程可詳見實施例圖2至圖6的存儲方法。請參閱圖2(a),圖2(a)是本發(fā)明實施例的一種存儲方法的一實施例的流程示意圖。圖1所示的服務(wù)器和存儲控制器執(zhí)行圖2(a)所示的存儲方法。如圖2(a)所示,本發(fā)明實施例的一種存儲方法的一實施例可以包括以下步驟。S100,服務(wù)器獲取存儲操作請求,根據(jù)所述存儲操作請求生成存儲指令序列。具體實現(xiàn)中,服務(wù)器讀取數(shù)據(jù)包的存儲操作請求,針對數(shù)據(jù)包的存儲操作請求生成存儲指令序列。作為一種可實施的方式,存儲指令序列的格式可圖2(b)所示,圖2(b)是本發(fā)明一實施例提供的一種存儲指令序列格式示意圖。其中,存儲指令序列的各個字段意義如下:S101,服務(wù)器確定所述存儲操作請求的操作類型、存儲類型標(biāo)識以及所述存儲指令序列的內(nèi)存地址。具體實現(xiàn)中,存儲操作請求的操作類型用于指示存儲數(shù)據(jù)、讀取數(shù)據(jù)、刪除數(shù)據(jù)以及廢棄數(shù)據(jù)中的任一種操作類型,具體可以用操作碼表示,以表示存儲操作的操作類型。如下所示:操作碼指令描述01h單次寫數(shù)據(jù):Write02h單次讀取數(shù)據(jù):Read03h單次獲取Key對應(yīng)Value的長度:GetLength04h單次刪除數(shù)據(jù):Delete05h單次廢棄數(shù)據(jù):TRIM06h聚合寫數(shù)據(jù):Write07h聚合讀取數(shù)據(jù):Read08h聚合獲取Key對應(yīng)Value的長度:GetLength09h聚合刪除數(shù)據(jù):Delete0Ah聚合廢棄數(shù)據(jù):TRIM具體實現(xiàn)中,存儲類型標(biāo)識用于指示所述存儲操作請求的存儲類型為鍵值存儲或者塊存儲。具體實現(xiàn)中,存儲指令序列的內(nèi)存地址用于指示存儲控制器根據(jù)存儲指令序列的內(nèi)存地址獲取存儲指令序列,從而獲得數(shù)據(jù)包的相關(guān)信息。S102,服務(wù)器根據(jù)所述存儲操作請求的操作類型、所述存儲類型標(biāo)識以及所述存儲指令序列的內(nèi)存地址生成存儲請求隊列。具體實現(xiàn)中,可在存儲請求隊列的DWORD0字段填存儲操作請求的操作類型,在存儲請求隊列的SLBA和NLB字段填存儲類型標(biāo)識,可在存儲請求隊列的DataPointer字段填存儲指令序列存放的地址。存儲類型標(biāo)識用于指示所述存儲操作請求的存儲類型為鍵值存儲時,在存儲請求隊列的SLBA和NLB字段填的存儲類型標(biāo)識為預(yù)設(shè)無效值?;蛘?,存儲類型標(biāo)識根據(jù)存儲請求隊列中標(biāo)識的存儲數(shù)據(jù)在所述存儲中需要存儲的位置與所述存儲的數(shù)據(jù)的長度的和是否大于所述存儲控制器的容量確定存儲類型標(biāo)識是否為預(yù)設(shè)無效值。例如,存儲介質(zhì)的存儲總?cè)萘繛閄時,在存儲請求隊列的SLBA字段填邏輯區(qū)塊起始地址為Y,NLB字段填邏輯塊的數(shù)量為Z,當(dāng)Y+Z>X時,即表示Y和Z填入的是無效值,也就是操作的數(shù)據(jù)超出后端存儲介質(zhì)的容量時,即認(rèn)為是無效值。作為一種可實施的方式,NVMe協(xié)議SubmissionQueueEntry占用一段連續(xù)的64字節(jié)內(nèi)存,NVMe協(xié)議中IO操作相關(guān)的指令碼,如圖2(c)所示,圖2(c)是本發(fā)明一實施例提供的NVMe協(xié)議中IO操作相關(guān)的指令碼示意圖。具體實現(xiàn)中,生成的存儲請求隊列如圖2(d)所示,圖2(d)是本發(fā)明一實施例提供的存儲請求隊列示意圖。S103,服務(wù)器發(fā)送所述存儲請求隊列至存儲控制器。具體實現(xiàn)中,服務(wù)器將存儲請求隊列發(fā)送至存儲控制器,所述存儲請求隊列用于指示所述存儲控制器根據(jù)所述存儲請求隊列執(zhí)行相應(yīng)的存儲操作。采用本發(fā)明實施例,利用協(xié)議指向的數(shù)據(jù)段來傳輸鍵值存儲的存儲請求隊列,存儲請求隊列中包含了存儲操作請求的操作類型、存儲指令序列的內(nèi)存地址、存儲類型標(biāo)識,存儲類型標(biāo)識用于指示存儲操作請求的存儲類型為鍵值存儲或者塊存儲,以使存儲控制器根據(jù)存儲請求隊列執(zhí)行相應(yīng)的存儲操作,減少多層存儲協(xié)議棧之間的轉(zhuǎn)換,縮短IO路徑和時延,提高鍵值存儲效率。此外,借助標(biāo)準(zhǔn)存儲協(xié)議,使得存儲控制系統(tǒng)或者存儲控制器同時具有鍵值存儲和塊存儲的特性。請參閱圖3(a),圖3(a)是本發(fā)明實施例的一種存儲方法的另一實施例的流程示意圖。圖1所示的服務(wù)器和存儲控制器執(zhí)行圖3(a)所示的存儲方法。圖3(a)實施例針對存儲操作請求的操作類型為存儲數(shù)據(jù)(即寫操作)進(jìn)行具體說明。存儲操作請求的存儲類型為鍵值存儲。如圖3所示,本發(fā)明實施例的一種存儲方法的另一實施例可以包括以下步驟。S200,服務(wù)器獲取存儲操作請求,根據(jù)所述存儲操作請求生成存儲指令序列。具體實現(xiàn)中,服務(wù)器讀取數(shù)據(jù)包的存儲操作請求,針對數(shù)據(jù)包的存儲操作請求生成存儲指令序列。具體地,應(yīng)用層的應(yīng)用模塊調(diào)用中間件的寫接口:其代碼為Put(StringKey,StringValue),由中間件提交寫操作的存儲操作請求、Key和Value數(shù)據(jù)存放的地址到NVMe驅(qū)動層,NVMe驅(qū)動層根據(jù)寫操作的存儲操作請求生成存儲指令序列。作為一種可實施的方式,生成存儲指令序列的流程(未圖示)具體為:S2001,NVMe驅(qū)動層申請64字節(jié)內(nèi)存地址存放存儲指令序列;S2002,KVCommand字段填KV寫操作碼01h,該字段用于指示存儲操作請求的操作類型為存儲數(shù)據(jù)的操作類型;S2003,KeyPointer字段填Key存放的內(nèi)存地址;S2004,KeyLength字段填Key數(shù)據(jù)長度;S2005,KeydataCRCvalue字段存放key數(shù)據(jù)的CRC值;S2006,ValuePointer字段填Value存放的內(nèi)存地址;S2007,ValueLength字段填Value數(shù)據(jù)長度;S2008,ValuedataCRCvalue字段存放Value數(shù)據(jù)的CRC值;S2009,CommanddataCRCvalue字段存放64字節(jié)指令序列的CRC值。S201,服務(wù)器確定所述存儲操作請求的操作類型、存儲類型標(biāo)識以及所述存儲指令序列的內(nèi)存地址。具體實現(xiàn)中,NVMe驅(qū)動層將存儲指令序列存放的內(nèi)存地址傳遞給NVMe命令轉(zhuǎn)換模塊,并確定存儲操作請求的操作類型為存儲數(shù)據(jù)(即寫操作),確定存儲操作請求的存儲類型為鍵值存儲,根據(jù)存儲操作請求的存儲類型生成對應(yīng)的存儲類型標(biāo)識,用于指示該存儲操作請求為鍵值存儲的操作請求。S202,服務(wù)器根據(jù)所述存儲操作請求的操作類型、所述存儲類型標(biāo)識以及所述存儲指令序列的內(nèi)存地址生成存儲請求隊列。具體實現(xiàn)中,服務(wù)器生成存儲請求隊列,由NVMe命令轉(zhuǎn)換模塊在存儲請求隊列的DWORD0字段填存儲操作請求的操作類型(即NVMe寫命令操作碼01h),在存儲請求隊列的SLBA字段和NLB字段填存儲類型標(biāo)識(即無效值全F),在存儲請求隊列的DataPointer字段填存儲指令序列存放的內(nèi)存地址。具體的,生成的用于請求存儲數(shù)據(jù)(即寫操作)的存儲請求隊列如圖3(b)所示,圖3(b)是本發(fā)明另一實施例提供的存儲請求隊列示意圖。作為一種可實施的方式,存儲類型標(biāo)識根據(jù)存儲請求隊列中標(biāo)識的存儲數(shù)據(jù)在所述存儲中需要存儲的位置與所述存儲的數(shù)據(jù)的長度的和是否大于所述存儲控制器的容量確定存儲類型標(biāo)識是否為預(yù)設(shè)無效值。例如,存儲介質(zhì)的存儲總?cè)萘繛閄時,在存儲請求隊列的SLBA字段填邏輯區(qū)塊起始地址為Y,NLB字段填邏輯塊的數(shù)量為Z,當(dāng)Y+Z>X時,即表示Y和Z填入的是無效值,也就是操作的數(shù)據(jù)超出后端存儲介質(zhì)的容量時,即認(rèn)為是無效值。S203,服務(wù)器發(fā)送所述存儲請求隊列至存儲控制器,所述存儲請求隊列用于指示所述存儲控制器根據(jù)所述存儲請求隊列執(zhí)行存儲數(shù)據(jù)的存儲操作。具體實現(xiàn)中,NVMe驅(qū)動層發(fā)送所述存儲請求隊列至存儲控制器,以使存儲控制器根據(jù)接收的存儲請求隊列執(zhí)行存儲數(shù)據(jù)的存儲操作。S204,存儲控制器獲取存儲請求隊列。S205,所述存儲控制器根據(jù)所述存儲請求隊列獲取所述存儲指令序列的內(nèi)存地址、存儲操作請求的操作類型以及存儲類型標(biāo)識。S206,所述存儲控制器根據(jù)所述存儲類型標(biāo)識確定所述存儲操作請求的存儲類型為鍵值存儲。具體實現(xiàn)中,存儲控制器中的NVMe命令處理單元分析存儲請求隊列中的SLBA字段和NLB字段為無效值,則判定為鍵值存儲操作。NVMe命令處理單元分析發(fā)送存儲請求隊列中的寫指令、Key和Value的地址信息,提交寫操作的存儲操作請求到鍵值存儲處理單元。S207,所述存儲控制器根據(jù)所述存儲指令序列的內(nèi)存地址獲取所述存儲指令序列。具體實現(xiàn)中,鍵值存儲處理單元處理Key和Value信息,轉(zhuǎn)換寫操作的存儲操作請求為對應(yīng)存儲設(shè)備的寫操作請求,并提交寫操作的存儲操作請求到存儲控制單元。S208,所述存儲控制器根據(jù)所述存儲操作請求的操作類型對所述存儲指令序列執(zhí)行存儲數(shù)據(jù)的鍵值存儲操作。具體實現(xiàn)中,存儲控制單元寫數(shù)據(jù)到存儲介質(zhì)(如后端存儲設(shè)備)。S209,所述存儲控制器輸出操作狀態(tài)信息。具體實現(xiàn)中,存儲控制器寫數(shù)據(jù)到后端存儲設(shè)備后,向服務(wù)器返回操作狀態(tài)信息,以指示存儲控制器執(zhí)行寫數(shù)據(jù)的存儲操作的狀態(tài)。具體地,存儲控制單元寫數(shù)據(jù)到后端存儲設(shè)備之后,向鍵值存儲處理單元返回操作狀態(tài)信息,再由鍵值存儲單元及前述單元發(fā)送至服務(wù)器。S210,服務(wù)器接收所述存儲控制器返回的操作狀態(tài)信息,所述操作狀態(tài)信息用于指示所述存儲控制器執(zhí)行所述存儲數(shù)據(jù)的存儲操作的狀態(tài)。具體實現(xiàn)中,服務(wù)器內(nèi)的NVMe命令轉(zhuǎn)換模塊傳遞操作狀態(tài)信息到中間件。最后,中間件返回操作狀態(tài)信息到應(yīng)用層,處理結(jié)束。采用本發(fā)明實施例,利用協(xié)議指向的數(shù)據(jù)段來傳輸鍵值存儲的存儲請求隊列,存儲請求隊列中包含了存儲操作請求的操作類型、存儲指令序列的內(nèi)存地址、存儲類型標(biāo)識,存儲類型標(biāo)識用于指示存儲操作請求的存儲類型為鍵值存儲或者塊存儲,以使存儲控制器根據(jù)存儲請求隊列執(zhí)行相應(yīng)的存儲操作,減少多層存儲協(xié)議棧之間的轉(zhuǎn)換,縮短IO路徑和時延,提高鍵值存儲效率。此外,借助標(biāo)準(zhǔn)存儲協(xié)議,使得存儲控制系統(tǒng)或者存儲控制器同時具有鍵值存儲和塊存儲的特性。請參閱圖4(a),圖4(a)是本發(fā)明實施例的一種存儲方法的另一實施例的流程示意圖。圖1所示的服務(wù)器和存儲控制器執(zhí)行圖4(a)所示的存儲方法。圖4(a)實施例針對存儲操作請求的操作類型為讀取數(shù)據(jù)(即讀操作)進(jìn)行具體說明。存儲操作請求的存儲類型為鍵值存儲。讀取數(shù)據(jù)可包括獲取Key對應(yīng)Value長度,或者獲取Value信息,本實施例針對獲取Key對應(yīng)Value長度,或者獲取Value信息進(jìn)行一一說明。如圖4(a)所示,本發(fā)明實施例的一種存儲方法的另一實施例可以包括以下步驟。S300,服務(wù)器獲取存儲操作請求,根據(jù)所述存儲操作請求獲取鍵值長度,根據(jù)所述鍵值長度生成存儲指令序列。具體實現(xiàn)中,服務(wù)器讀取數(shù)據(jù)包的存儲操作請求,針對數(shù)據(jù)包的存儲操作請求生成存儲指令序列。具體地,應(yīng)用層的應(yīng)用模塊調(diào)用中間件讀操作接口:其代碼為Get(StringKey)。其中,存儲操作請求可為獲取Key對應(yīng)Value長度的請求或者獲取Value信息的請求。作為一種可實施的方式,對于獲取Key對應(yīng)Value長度的請求,由于讀取的數(shù)據(jù)包的長度不固定,因此需要由中間件提交獲取Key對應(yīng)Value長度的請求到NVMe驅(qū)動層,NVMe驅(qū)動層則根據(jù)獲取Key對應(yīng)Value長度的請求生成存儲指令序列。生成獲取Key對應(yīng)Value長度的存儲指令序列的流程(未圖示)具體為:S3001,申請64字節(jié)內(nèi)存做存儲指令序列;S3002,KVCommand字段填獲取Key對應(yīng)Value的長度讀操作碼03h,該字段用于指示存儲操作請求的操作類型為獲取Key對應(yīng)Value的長度的操作類型;S3003,KeyPointer字段填Key存放的內(nèi)存指針;S3004,KeyLength字段填Key數(shù)據(jù)的長度;S3005,KeyDataCRCValue字段填Key數(shù)據(jù)的CRC值;S3006,ValuePointer字段填0,表示無數(shù)據(jù)傳輸;S3007,ValueLength字段填0,表示無數(shù)據(jù)傳輸;S3008,ValueDataCRCValue字段填0,表示無數(shù)據(jù)傳輸;S3009,CommandDataCRCValue字段填指令序列數(shù)據(jù)的CRC值。作為一種可實施的方式,對于獲取Value信息的請求,生成獲取Value信息的存儲指令序列的流程(未圖示)具體為:S30010,申請64字節(jié)內(nèi)存做KV指令序列;S30011,KVCommand字段填獲取Key對應(yīng)Value的操作碼02h,該字段用于指示存儲操作請求的操作類型為獲取Value信息的操作類型;S30012,KeyPointer字段填Key存放的內(nèi)存指針;S30013,KeyLength字段填Key數(shù)據(jù)的長度;S30014,KeyDataCRCValue字段填Key數(shù)據(jù)的CRC值;S30015,ValuePointer字段填控制器將讀出的Value存放到主機(jī)的內(nèi)存地址;S30016,ValueLength字段填控制器讀Value數(shù)據(jù)的長度;S30017,ValueDataCRCValue字段填0;S30018,CommandDataCRCValue字段填指令序列數(shù)據(jù)的CRC值。S301,服務(wù)器確定所述存儲操作請求的操作類型、存儲類型標(biāo)識以及所述存儲指令序列的內(nèi)存地址。具體實現(xiàn)中,NVMe驅(qū)動層將存儲指令序列存放的內(nèi)存地址傳遞給NVMe命令轉(zhuǎn)換模塊,并確定存儲操作請求的操作類型為讀取數(shù)據(jù)(即讀操作),確定存儲操作請求的存儲類型為鍵值存儲,根據(jù)存儲操作請求的存儲類型生成對應(yīng)的存儲類型標(biāo)識,用于指示該存儲操作請求為鍵值存儲的操作請求。S302,服務(wù)器根據(jù)所述存儲操作請求的操作類型、所述存儲類型標(biāo)識以及所述存儲指令序列的內(nèi)存地址生成存儲請求隊列。具體實現(xiàn)中,服務(wù)器生成存儲請求隊列,由NVMe命令轉(zhuǎn)換模塊在存儲請求隊列的DWORD0字段填存儲操作請求的操作類型(即NVMe讀命令操作碼02h),在存儲請求隊列的SLBA字段和NLB字段填存儲類型標(biāo)識(即無效值全F),在存儲請求隊列的DataPointer字段填存儲指令序列存放的內(nèi)存地址。作為一種可實施的方式,生成的用于請求讀取數(shù)據(jù)(如獲取Key對應(yīng)Value的長度)的存儲請求隊列如圖4(b)所示,圖4(b)是本發(fā)明另一實施例提供的存儲請求隊列示意圖。作為一種可實施的方式,生成的用于請求讀取數(shù)據(jù)(如獲取Value信息)的存儲請求隊列如圖4(c)所示,圖4(c)是本發(fā)明另一實施例提供的存儲請求隊列示意圖。作為一種可實施的方式,存儲類型標(biāo)識根據(jù)存儲請求隊列中標(biāo)識的存儲數(shù)據(jù)在所述存儲中需要存儲的位置與所述存儲的數(shù)據(jù)的長度的和是否大于所述存儲控制器的容量確定存儲類型標(biāo)識是否為預(yù)設(shè)無效值。例如,存儲介質(zhì)的存儲總?cè)萘繛閄時,在存儲請求隊列的SLBA字段填邏輯區(qū)塊起始地址為Y,NLB字段填邏輯塊的數(shù)量為Z,當(dāng)Y+Z>X時,即表示Y和Z填入的是無效值,也就是操作的數(shù)據(jù)超出后端存儲介質(zhì)的容量時,即認(rèn)為是無效值。S303,服務(wù)器發(fā)送所述存儲請求隊列至存儲控制器,所述存儲請求隊列用于指示所述存儲控制器根據(jù)所述存儲請求隊列執(zhí)行讀取數(shù)據(jù)的存儲操作。具體實現(xiàn)中,NVMe驅(qū)動層發(fā)送所述存儲請求隊列至存儲控制器,以使存儲控制器根據(jù)接收的存儲請求隊列執(zhí)行讀取數(shù)據(jù)的存儲操作。S304,存儲控制器獲取存儲請求隊列。S305,所述存儲控制器根據(jù)所述存儲請求隊列獲取所述存儲指令序列的內(nèi)存地址、存儲操作請求的操作類型以及存儲類型標(biāo)識。S306,所述存儲控制器根據(jù)所述存儲類型標(biāo)識確定所述存儲操作請求的存儲類型為鍵值存儲。具體實現(xiàn)中,存儲控制器中的NVMe命令處理單元分析存儲請求隊列中的SLBA字段和NLB字段為無效值,則判定為鍵值存儲操作。S307,所述存儲控制器根據(jù)所述存儲指令序列的內(nèi)存地址獲取所述存儲指令序列。S308,所述存儲控制器根據(jù)所述存儲操作請求的操作類型對所述存儲指令序列執(zhí)行讀取數(shù)據(jù)的鍵值存儲操作。具體實現(xiàn)中,對于獲取Key對應(yīng)Value長度的請求,NVMe命令處理單元分析存儲請求隊列中的讀取指令、Key信息,提交讀Key對應(yīng)Value長度操作的存儲操作請求到鍵值存儲處理單元。鍵值存儲處理單元根據(jù)Key信息從存儲介質(zhì)(如后端存儲設(shè)備)獲取對應(yīng)Value的長度,提交長度信息到NVMe命令處理單元。具體實現(xiàn)中,對于獲取Value信息的請求,NVMe命令處理單元分析存儲請求隊列中的讀取指令、Value內(nèi)存地址信息,提交讀Value信息操作的存儲操作請求到鍵值存儲處理單元。鍵值存儲處理單元提交讀Value信息操作的存儲操作請求到存儲控制單元,由存儲控制單元執(zhí)行數(shù)據(jù)讀操作。存儲控制單元讀Value信息到服務(wù)器分配給Value存放的內(nèi)存地址。S309,所述存儲控制器輸出操作狀態(tài)信息。具體實現(xiàn)中,存儲控制器讀取數(shù)據(jù)之后,向服務(wù)器返回操作狀態(tài)信息,以指示存儲控制器執(zhí)行讀取數(shù)據(jù)的存儲操作的狀態(tài)。具體實現(xiàn)中,對于獲取Key對應(yīng)Value長度的請求,存儲控制器的NVMe命令處理單元返回Value長度至服務(wù)器。具體實現(xiàn)中,對于獲取Value信息的請求,存儲控制單元讀取Value信息之后,提交讀Value信息的操作狀態(tài)信息到鍵值存儲處理單元,鍵值存儲處理單元提交讀Value信息的操作狀態(tài)信息到NVMe命令處理單元,NVMe命令處理單元可將讀Value信息的操作狀態(tài)信息填到和服務(wù)器相互交互的完成隊列里,并將完成隊列發(fā)送至服務(wù)器。S310,服務(wù)器接收所述存儲控制器返回的操作狀態(tài)信息,所述操作狀態(tài)信息用于指示所述存儲控制器執(zhí)行所述讀取數(shù)據(jù)的存儲操作的狀態(tài)。具體實現(xiàn)中,對于獲取Key對應(yīng)Value長度的請求,服務(wù)器內(nèi)的NVMe命令轉(zhuǎn)換模塊傳遞攜帶Value長度的操作狀態(tài)信息到中間件。最后,中間件根據(jù)Value長度分配Value數(shù)據(jù)在主機(jī)端存放的內(nèi)存空間。具體實現(xiàn)中,對于獲取Value信息的請求,服務(wù)器的NVMe驅(qū)動層接收完成隊列。最后NVMe驅(qū)動層提交讀Value信息的操作狀態(tài)信息到中間件。中間件將接收的讀Value信息的操作狀態(tài)信息發(fā)送給應(yīng)用模塊。采用本發(fā)明實施例,利用協(xié)議指向的數(shù)據(jù)段來傳輸鍵值存儲的存儲請求隊列,存儲請求隊列中包含了存儲操作請求的操作類型、存儲指令序列的內(nèi)存地址、存儲類型標(biāo)識,存儲類型標(biāo)識用于指示存儲操作請求的存儲類型為鍵值存儲或者塊存儲,以使存儲控制器根據(jù)存儲請求隊列執(zhí)行相應(yīng)的存儲操作,減少多層存儲協(xié)議棧之間的轉(zhuǎn)換,縮短IO路徑和時延,提高鍵值存儲效率。此外,借助標(biāo)準(zhǔn)存儲協(xié)議,使得存儲控制系統(tǒng)或者存儲控制器同時具有鍵值存儲和塊存儲的特性。請參閱圖5(a),圖5(a)是本發(fā)明實施例的一種存儲方法的另一實施例的流程示意圖。圖1所示的服務(wù)器和存儲控制器執(zhí)行圖5(a)所示的存儲方法。圖5(a)實施例針對存儲操作請求的操作類型為刪除數(shù)據(jù)或廢棄數(shù)據(jù)進(jìn)行具體說明。存儲操作請求的存儲類型為鍵值存儲。如圖5(a)所示,本發(fā)明實施例的一種存儲方法的另一實施例可以包括以下步驟。S400,服務(wù)器獲取存儲操作請求,根據(jù)所述存儲操作請求生成存儲指令序列。具體實現(xiàn)中,服務(wù)器讀取數(shù)據(jù)包的存儲操作請求,針對數(shù)據(jù)包的存儲操作請求生成存儲指令序列。具體地,應(yīng)用層的應(yīng)用模塊調(diào)用中間件的刪除或廢棄接口:其代碼為Delete(StringKey)或者TRIM(StringKey),以進(jìn)行刪除或者廢棄數(shù)據(jù)操作,由中間件提交刪除或廢棄操作的存儲操作請求(即刪除或廢棄操作的操作碼)、Key數(shù)據(jù)存放的地址信息至NVMe驅(qū)動層。NVMe驅(qū)動層根據(jù)刪除或者廢棄操作的存儲操作請求生成存儲指令序列。作為一種可實施的方式,生成存儲指令序列的流程(未圖示)具體為:S4001,NVMe驅(qū)動層申請64字節(jié)內(nèi)存地址存放存儲指令序列;S4002,KVCommand字段填刪除數(shù)據(jù)操作碼04h或者廢棄數(shù)據(jù)操作碼05h,該字段用于指示存儲操作請求的操作類型為刪除或廢棄數(shù)據(jù)的操作類型;S4003,KeyPointer字段填Key存放的內(nèi)存指針;S4004,KeyLength字段填Key數(shù)據(jù)的長度;S4005,KeyDataCRCValue字段填Key數(shù)據(jù)的CRC值;S4006,ValuePointer字段填0,表示無數(shù)據(jù)傳輸;S4007,ValueLength字段填0,表示無數(shù)據(jù)傳輸;S4008,ValueDataCRCValue字段填0,表示無數(shù)據(jù)傳輸;S4009,CommandDataCRCValue字段填指令序列數(shù)據(jù)的CRC值。S401,服務(wù)器確定所述存儲操作請求的操作類型、存儲類型標(biāo)識以及所述存儲指令序列的內(nèi)存地址。具體實現(xiàn)中,NVMe驅(qū)動層將存儲指令序列存放的內(nèi)存地址傳遞給NVMe命令轉(zhuǎn)換模塊,并確定存儲操作請求的操作類型為刪除或廢棄數(shù)據(jù),確定存儲操作請求的存儲類型為鍵值存儲,根據(jù)存儲操作請求的存儲類型生成對應(yīng)的存儲類型標(biāo)識,用于指示該存儲操作請求為鍵值存儲的操作請求。S402,服務(wù)器根據(jù)所述存儲操作請求的操作類型、所述存儲類型標(biāo)識以及所述存儲指令序列的內(nèi)存地址生成存儲請求隊列。具體實現(xiàn)中,服務(wù)器生成存儲請求隊列,由NVMe命令轉(zhuǎn)換模塊在存儲請求隊列的DWORD0字段填存儲操作請求的操作類型(即NVMe寫命令操作碼01h),在存儲請求隊列的SLBA字段和NLB字段填存儲類型標(biāo)識(即無效值全F),在存儲請求隊列的DataPointer字段填存儲指令序列存放的內(nèi)存地址。具體的,生成的用于請求刪除數(shù)據(jù)的存儲請求隊列如圖5(b)所示,圖5(b)是本發(fā)明另一實施例提供的存儲請求隊列示意圖。具體的,生成的用于請求廢棄數(shù)據(jù)的存儲請求隊列如圖5(c)所示,圖5(c)是本發(fā)明另一實施例提供的存儲請求隊列示意圖。作為一種可實施的方式,存儲類型標(biāo)識根據(jù)存儲請求隊列中標(biāo)識的存儲數(shù)據(jù)在所述存儲中需要存儲的位置與所述存儲的數(shù)據(jù)的長度的和是否大于所述存儲控制器的容量確定存儲類型標(biāo)識是否為預(yù)設(shè)無效值。例如,存儲介質(zhì)的存儲總?cè)萘繛閄時,在存儲請求隊列的SLBA字段填邏輯區(qū)塊起始地址為Y,NLB字段填邏輯塊的數(shù)量為Z,當(dāng)Y+Z>X時,即表示Y和Z填入的是無效值,也就是操作的數(shù)據(jù)超出后端存儲介質(zhì)的容量時,即認(rèn)為是無效值。S403,服務(wù)器發(fā)送所述存儲請求隊列至存儲控制器,所述存儲請求隊列用于指示所述存儲控制器根據(jù)所述存儲請求隊列執(zhí)行刪除數(shù)據(jù)或廢棄數(shù)據(jù)的存儲操作。具體實現(xiàn)中,NVMe驅(qū)動層發(fā)送所述存儲請求隊列至存儲控制器,以使存儲控制器根據(jù)接收的存儲請求隊列執(zhí)行刪除數(shù)據(jù)或廢棄數(shù)據(jù)的存儲操作。S404,存儲控制器獲取存儲請求隊列。S405,所述存儲控制器根據(jù)所述存儲請求隊列獲取所述存儲指令序列的內(nèi)存地址、存儲操作請求的操作類型以及存儲類型標(biāo)識。S406,所述存儲控制器根據(jù)所述存儲類型標(biāo)識確定所述存儲操作請求的存儲類型為鍵值存儲。具體實現(xiàn)中,存儲控制器中的NVMe命令處理單元分析存儲請求隊列中的SLBA字段和NLB字段為無效值,則判定為鍵值存儲操作。S407,所述存儲控制器根據(jù)所述存儲指令序列的內(nèi)存地址獲取所述存儲指令序列。具體實現(xiàn)中,NVMe命令處理單元分析發(fā)送存儲請求隊列中的刪除或廢棄指令、Key的地址信息,提交刪除或著廢棄操作的存儲操作請求到鍵值存儲處理單元。S408,所述存儲控制器根據(jù)所述存儲操作請求的操作類型對所述存儲指令序列執(zhí)行刪除數(shù)據(jù)或著廢棄數(shù)據(jù)的鍵值存儲操作。具體實現(xiàn)中,鍵值存儲處理單元處理Key信息,轉(zhuǎn)換刪除或著廢棄操作的存儲操作請求為對應(yīng)存儲設(shè)備的刪除或著廢棄操作,并提交刪除或著廢棄操作的存儲操作請求到存儲控制單元,最后由存儲控制單元執(zhí)行存儲介質(zhì)(如后端存儲設(shè)備)的刪除或著廢棄操作。S409,所述存儲控制器輸出操作狀態(tài)信息。具體實現(xiàn)中,存儲控制器對存儲介質(zhì)(如后端存儲設(shè)備)執(zhí)行刪除或著廢棄操作后,向服務(wù)器返回操作狀態(tài)信息,以指示存儲控制器執(zhí)行刪除或著廢棄的存儲操作的狀態(tài)。具體地,存儲控制單元對存儲介質(zhì)執(zhí)行刪除或著廢棄操作后,向鍵值存儲處理單元返回操作狀態(tài)信息,再由鍵值存儲單元及前述單元發(fā)送至服務(wù)器。S410,服務(wù)器接收所述存儲控制器返回的操作狀態(tài)信息,所述操作狀態(tài)信息用于指示所述存儲控制器執(zhí)行所述刪除數(shù)據(jù)或廢棄數(shù)據(jù)的存儲操作的狀態(tài)。具體實現(xiàn)中,服務(wù)器內(nèi)的NVMe命令轉(zhuǎn)換模塊傳遞操作狀態(tài)信息到中間件。最后,中間件返回操作狀態(tài)信息到應(yīng)用層,處理結(jié)束。采用本發(fā)明實施例,利用協(xié)議指向的數(shù)據(jù)段來傳輸鍵值存儲的存儲請求隊列,存儲請求隊列中包含了存儲操作請求的操作類型、存儲指令序列的內(nèi)存地址、存儲類型標(biāo)識,存儲類型標(biāo)識用于指示存儲操作請求的存儲類型為鍵值存儲或者塊存儲,以使存儲控制器根據(jù)存儲請求隊列執(zhí)行相應(yīng)的存儲操作,減少多層存儲協(xié)議棧之間的轉(zhuǎn)換,縮短IO路徑和時延,提高鍵值存儲效率。此外,借助標(biāo)準(zhǔn)存儲協(xié)議,使得存儲控制系統(tǒng)或者存儲控制器同時具有鍵值存儲和塊存儲的特性。請參閱圖6(a),圖6(a)是本發(fā)明實施例的一種存儲方法的另一實施例的流程示意圖。圖1所示的服務(wù)器和存儲控制器執(zhí)行圖6(a)所示的存儲方法。至少兩個鍵值的存儲操作也可稱為聚合操作。所謂聚合操作,指一次聚合存儲操作的請求可以同時完成多個單次存儲操作的請求,流程和單次請求操作的流程基本一致。不同的是,多個鍵(Key)或者值(Value)需要借助SGL(聚散表)通過NVMe發(fā)送隊列傳遞給存儲控制器。針對聚合操作的存儲操作請求的操作類型對應(yīng)的操作碼可如下所示:操作碼指令描述06h聚合寫數(shù)據(jù):Write07h聚合獲取數(shù)據(jù):Read08h聚合獲取Key對應(yīng)Value的長度:GetLength09h聚合刪除數(shù)據(jù):Delete0Ah聚合廢棄數(shù)據(jù):TRIM以聚合刪除請求為例,使用聚合刪除數(shù)據(jù)命令(09h)一次刪除4個鍵(Key)對應(yīng)的值(Value)數(shù)據(jù)。圖6(a)實施例針對存儲操作請求的操作類型為針對至少兩個鍵值的刪除數(shù)據(jù)進(jìn)行具體說明。存儲操作請求的存儲類型為鍵值存儲。當(dāng)鍵值存儲為聚合操作時,使用SGL表記錄多個Key或者Value的地址信息,SGL表是一段連續(xù)的內(nèi)存地址;一個SGL表中可以有多個entry,前一個entry存完后緊接著存后一個entry;每一個entry表示一個Key或者Value的地址信息,每一個entry由SGLKeyPointer、SGLKeylength和SGLKeydataCRCvalue三個元素組成,SGL表定義格式如圖6(b)所示,圖6(b)是本發(fā)明另一實施例提供的SGL表定義格式示意圖。其字段定義如下:生成聚合操作的存儲指令序列的流程(未圖示)具體為:S1,主機(jī)側(cè)分配鍵值存儲指令序列存放的內(nèi)存空間。S2,根據(jù)鍵值存儲操作請求需要操作的Key或者Value的個數(shù),計算SGL中entry的個數(shù);在根據(jù)entry的個數(shù)計算SGL表的大?。辉谥鳈C(jī)側(cè)分配SGL表存放的內(nèi)存空間。S3,根據(jù)鍵值存儲操作請求的需要,KVCommand字段填聚合指令的操作碼。S4,根據(jù)鍵值存儲操作請求的需要,KeyPointer字段填Key數(shù)據(jù)使用的SGL表存放的內(nèi)存指針。S5,根據(jù)鍵值存儲操作請求的需要,KeyLength字段填Key數(shù)據(jù)使用的SGL表的長度。S6,根據(jù)鍵值存儲操作請求的需要,KeyDataCRCValue字段填Key數(shù)據(jù)使用的SGL表數(shù)據(jù)的CRC值。S7,根據(jù)鍵值存儲操作請求的需要,ValuePointer字段填Value數(shù)據(jù)使用的SGL表存放的內(nèi)存指針。S8,根據(jù)鍵值存儲操作請求的需要,ValueLength字段填Value數(shù)據(jù)使用的SGL表的長度。S9,根據(jù)鍵值存儲操作請求的需要,ValueDataCRCValue字段填Value數(shù)據(jù)使用的SGL表數(shù)據(jù)的CRC值。S10,填充SGL表項內(nèi)容。S11,第一個SGLPointer填第一個key或者Value存放的內(nèi)存指針。S12,第一個SGLLength字段填第一個key或者Value的長度。S13,第一個SGLDataCRCValue第一個key或者Value的CRC值。S14,按前面步驟依次將全部key或者Value信息填入SGL表中。S15,CommandDataCRCValue字段填指令序列數(shù)據(jù)的CRC值。如圖6所示,本發(fā)明實施例的一種存儲方法的另一實施例可以包括以下步驟。S500,服務(wù)器獲取存儲操作請求,根據(jù)所述存儲操作請求生成存儲指令序列,生成的存儲指令序列包括至少兩個鍵值的子存儲指令序列。具體實現(xiàn)中,服務(wù)器讀取數(shù)據(jù)包的存儲操作請求,針對數(shù)據(jù)包的存儲操作請求生成存儲指令序列。具體地,應(yīng)用層的應(yīng)用模塊調(diào)用中間件的刪除接口:其代碼為Delete_Group(StringKeygroup),以進(jìn)行刪除至少兩個鍵值的操作,由中間件提交刪除操作的存儲操作請求(即刪除至少兩個鍵值操作的操作碼)、Key數(shù)據(jù)存放的地址信息至NVMe驅(qū)動層。NVMe驅(qū)動層根據(jù)刪除至少兩個鍵值操作的存儲操作請求生成存儲指令序列。作為一種可實施的方式,生成刪除至少兩個鍵值操作的存儲指令序列的流程(未圖示)具體為:S5001,申請64字節(jié)內(nèi)存做KV指令序列;S5002,每條key記錄在SGL占24字節(jié),根據(jù)Key個數(shù)分配SGL表內(nèi)存;S5003,KVCommand字段填聚合刪除操作碼09h,該字段用于指示存儲操作請求的操作類型為刪除至少兩個鍵值的操作類型;S5004,KeyPointer字段填SGL表存放的內(nèi)存指針;S5005,KeyLength字段填SGL表的長度;S5006,KeyDataCRCValue字段填SGL表數(shù)據(jù)的CRC值;S5007,第一個SGLPointer填第一個key存放的內(nèi)存指針;S5008,第一個SGLLength字段填第一個Key的長度;S5009,第一個SGLDataCRCValue第一個Key的CRC值;S5010,按前面步驟依次將全部Key信息填入SGL表中;S5011,ValuePointer字段填0,表示無數(shù)據(jù)傳輸;S5012,ValueLength字段填0,表示無數(shù)據(jù)傳輸;S5013,ValueDataCRCValue字段填0,表示無數(shù)據(jù)傳輸;S5014,CommandDataCRCValue字段填指令序列數(shù)據(jù)的CRC值。S501,服務(wù)器確定所述存儲操作請求的操作類型、存儲類型標(biāo)識,針對所述至少兩個鍵值的子存儲指令序列確定對應(yīng)的內(nèi)存地址。具體實現(xiàn)中,NVMe驅(qū)動層將存儲指令序列存放的內(nèi)存地址傳遞給NVMe命令轉(zhuǎn)換模塊,并確定存儲操作請求的操作類型為刪除至少兩個鍵值,確定存儲操作請求的存儲類型為鍵值存儲,根據(jù)存儲操作請求的存儲類型生成對應(yīng)的存儲類型標(biāo)識,用于指示該存儲操作請求為鍵值存儲的操作請求。S502,服務(wù)器根據(jù)所述存儲操作請求的操作類型、所述存儲類型標(biāo)識以及所述至少兩個鍵值的子存儲指令序列的內(nèi)存地址生成存儲請求隊列。具體實現(xiàn)中,服務(wù)器生成存儲請求隊列,由NVMe命令轉(zhuǎn)換模塊在存儲請求隊列的DWORD0字段填存儲操作請求的操作類型(即NVMe寫命令操作碼01h),在存儲請求隊列的SLBA字段和NLB字段填存儲類型標(biāo)識(即無效值全F),在存儲請求隊列的DataPointer字段填存儲指令序列存放的內(nèi)存地址。具體的,生成的用于請求刪除至少兩個鍵值的存儲請求隊列如圖6(c)所示,圖6(c)是本發(fā)明另一實施例提供的存儲請求隊列示意圖。作為一種可實施的方式,存儲類型標(biāo)識根據(jù)存儲請求隊列中標(biāo)識的存儲數(shù)據(jù)在所述存儲中需要存儲的位置與所述存儲的數(shù)據(jù)的長度的和是否大于所述存儲控制器的容量確定存儲類型標(biāo)識是否為預(yù)設(shè)無效值。例如,存儲介質(zhì)的存儲總?cè)萘繛閄時,在存儲請求隊列的SLBA字段填邏輯區(qū)塊起始地址為Y,NLB字段填邏輯塊的數(shù)量為Z,當(dāng)Y+Z>X時,即表示Y和Z填入的是無效值,也就是操作的數(shù)據(jù)超出后端存儲介質(zhì)的容量時,即認(rèn)為是無效值。S503,服務(wù)器發(fā)送所述存儲請求隊列至存儲控制器,所述存儲請求隊列用于指示所述存儲控制器根據(jù)所述存儲請求隊列執(zhí)行刪除所述至少兩個鍵值的存儲操作。具體實現(xiàn)中,NVMe驅(qū)動層發(fā)送所述存儲請求隊列至存儲控制器,以使存儲控制器根據(jù)接收的存儲請求隊列執(zhí)行刪除至少兩個鍵值的存儲操作。S504,存儲控制器獲取存儲請求隊列。S505,所述存儲控制器根據(jù)所述存儲請求隊列獲取所述存儲指令序列的內(nèi)存地址、存儲操作請求的操作類型以及存儲類型標(biāo)識。S506,所述存儲控制器根據(jù)所述存儲類型標(biāo)識確定所述存儲操作請求的存儲類型為鍵值存儲。具體實現(xiàn)中,存儲控制器中的NVMe命令處理單元分析存儲請求隊列中的SLBA字段和NLB字段為無效值,則判定為鍵值存儲操作。S507,所述存儲控制器根據(jù)所述存儲指令序列的內(nèi)存地址獲取所述存儲指令序列。S508,所述存儲控制器根據(jù)所述存儲操作請求的操作類型對所述存儲指令序列執(zhí)行刪除所述至少兩個鍵值的鍵值存儲操作。具體實現(xiàn)中,NVMe命令處理單元分析發(fā)送存儲請求隊列中的刪除至少兩個鍵值的指令、SGL的地址信息,提交刪除至少兩個鍵值的存儲操作請求到鍵值存儲處理單元。鍵值存儲處理單元對SGL重存放的Key逐一進(jìn)行處理,轉(zhuǎn)換聚合操作為每個Key對應(yīng)存儲設(shè)備中數(shù)據(jù)的刪除至少兩個鍵值的存儲操作請求,提交請求到存儲控制單元,最后由存儲控制單元對存儲介質(zhì)(如后端存儲設(shè)備)中的至少兩個鍵值進(jìn)行刪除。S509,所述存儲控制器輸出操作狀態(tài)信息。具體實現(xiàn)中,存儲控制單元對存儲介質(zhì)(如后端存儲設(shè)備)中的至少兩個鍵值進(jìn)行刪除后,向服務(wù)器返回操作狀態(tài)信息,以指示存儲控制器執(zhí)行刪除至少兩個鍵值的存儲操作的狀態(tài)。具體地,存儲控制單元對存儲介質(zhì)執(zhí)行刪除至少兩個鍵值后,向鍵值存儲處理單元返回操作狀態(tài)信息,再由鍵值存儲單元及前述單元發(fā)送至服務(wù)器。S510,服務(wù)器接收所述存儲控制器返回的操作狀態(tài)信息,所述操作狀態(tài)信息用于指示所述存儲控制器執(zhí)行所述刪除所述至少兩個鍵值的存儲操作的狀態(tài)。具體實現(xiàn)中,服務(wù)器內(nèi)的NVMe命令轉(zhuǎn)換模塊傳遞操作狀態(tài)信息到中間件。最后,中間件返回操作狀態(tài)信息到應(yīng)用層,處理結(jié)束。采用本發(fā)明實施例,利用協(xié)議指向的數(shù)據(jù)段來傳輸鍵值存儲的存儲請求隊列,存儲請求隊列中包含了存儲操作請求的操作類型、存儲指令序列的內(nèi)存地址、存儲類型標(biāo)識,存儲類型標(biāo)識用于指示存儲操作請求的存儲類型為鍵值存儲或者塊存儲,以使存儲控制器根據(jù)存儲請求隊列執(zhí)行相應(yīng)的存儲操作,減少多層存儲協(xié)議棧之間的轉(zhuǎn)換,縮短IO路徑和時延,提高鍵值存儲效率。此外,借助標(biāo)準(zhǔn)存儲協(xié)議,使得存儲控制系統(tǒng)或者存儲控制器同時具有鍵值存儲和塊存儲的特性。請參閱圖7(a),圖7(a)是本發(fā)明實施例的一種存儲方法的另一實施例的流程示意圖。圖1所示的服務(wù)器和存儲控制器執(zhí)行圖7(a)所示的存儲方法。圖7(a)實施例針對存儲操作請求的操作類型為存儲數(shù)據(jù)(即寫操作)進(jìn)行具體說明。存儲操作請求的存儲類型為塊存儲。如圖7(a)所示,本發(fā)明實施例的一種存儲方法的另一實施例可以包括以下步驟。S600,服務(wù)器獲取存儲操作請求,根據(jù)所述存儲操作請求生成存儲指令序列。具體實現(xiàn)中,服務(wù)器讀取數(shù)據(jù)包的存儲操作請求,針對數(shù)據(jù)包的存儲操作請求生成存儲指令序列。具體地,應(yīng)用層的傳統(tǒng)應(yīng)用模塊調(diào)用文件系統(tǒng)的寫接口,由文件系統(tǒng)提交寫操作的存儲操作請求到NVMe驅(qū)動層,NVMe驅(qū)動層根據(jù)寫操作的存儲操作請求生成標(biāo)準(zhǔn)的NVMe存儲指令序列。作為一種可實施的方式,生成標(biāo)準(zhǔn)的NVMe存儲指令序列如圖7(b)所示,圖7(b)是本發(fā)明另一實施例提供的NVMe存儲指令序列示意圖。S601,服務(wù)器確定所述存儲操作請求的操作類型、存儲類型標(biāo)識以及所述存儲指令序列的內(nèi)存地址。具體實現(xiàn)中,服務(wù)器生成標(biāo)準(zhǔn)的NVMe存儲請求隊列,確定存儲操作請求的操作類型為寫操作,確定存儲類型標(biāo)識指示塊存儲,并確定所述存儲指令序列的內(nèi)存地址。作為一種可實施的方式,存儲類型標(biāo)識為塊存儲時,存儲類型標(biāo)識為預(yù)設(shè)有效值。作為一種可實施的方式,存儲類型標(biāo)識根據(jù)存儲請求隊列中標(biāo)識的存儲數(shù)據(jù)在所述存儲中需要存儲的位置與所述存儲的數(shù)據(jù)的長度的和是否大于所述存儲控制器的容量確定存儲類型標(biāo)識是否為預(yù)設(shè)有效值。例如,存儲介質(zhì)的存儲總?cè)萘繛閄時,在存儲請求隊列的SLBA字段填邏輯區(qū)塊起始地址為Y,NLB字段填邏輯塊的數(shù)量為Z,當(dāng)Y+Z<X時,即表示Y和Z填入的是有效值,也就是操作的數(shù)據(jù)小于后端存儲介質(zhì)的容量時,即認(rèn)為是有效值。S602,服務(wù)器根據(jù)所述存儲操作請求的操作類型、所述存儲類型標(biāo)識以及所述存儲指令序列的內(nèi)存地址生成存儲請求隊列,所述存儲操作請求的存儲類型為塊存儲。具體實現(xiàn)中,NVMe驅(qū)動層根據(jù)所述存儲操作請求的操作類型、所述存儲類型標(biāo)識以及所述存儲指令序列的內(nèi)存地址生成存儲請求隊列,其中,存儲操作請求的存儲類型為塊存儲。S603,服務(wù)器發(fā)送所述存儲請求隊列至存儲控制器,所述存儲請求隊列用于指示所述存儲控制器根據(jù)所述存儲請求隊列執(zhí)行存儲數(shù)據(jù)的存儲操作。具體實現(xiàn)中,NVMe驅(qū)動層發(fā)送所述存儲請求隊列至存儲控制器,以使存儲控制器根據(jù)接收的存儲請求隊列執(zhí)行存儲數(shù)據(jù)的存儲操作。S604,存儲控制器獲取存儲請求隊列。S605,所述存儲控制器根據(jù)所述存儲請求隊列獲取所述存儲指令序列的內(nèi)存地址、存儲操作請求的操作類型以及存儲類型標(biāo)識。S606,所述存儲控制器根據(jù)所述存儲類型標(biāo)識確定所述存儲操作請求的存儲類型為塊存儲。具體實現(xiàn)中,存儲控制器中的NVMe命令處理單元分析存儲請求隊列中的SLBA字段和NLB字段為預(yù)設(shè)有效值,則判定為塊存儲操作。S607,所述存儲控制器根據(jù)所述存儲指令序列的內(nèi)存地址獲取所述存儲指令序列。S608,所述存儲控制器根據(jù)所述存儲操作請求的操作類型對所述存儲指令序列執(zhí)行存儲數(shù)據(jù)的塊存儲操作。具體實現(xiàn)中,NVMe命令處理單元分析發(fā)送存儲請求隊列中的寫指令、Key和Value的地址信息,提交寫操作的存儲操作請求到NVMe操作處理單元。NVMe操作處理單元轉(zhuǎn)換寫操作的存儲操作請求為對應(yīng)存儲設(shè)備的寫操作請求,并提交寫操作的存儲操作請求到存儲控制單元,最后由存儲控制單元對存儲介質(zhì)(如后端存儲設(shè)備)進(jìn)行塊存儲。S609,所述存儲控制器輸出操作狀態(tài)信息。具體實現(xiàn)中,存儲控制器寫數(shù)據(jù)到后端存儲設(shè)備后,向服務(wù)器返回操作狀態(tài)信息,以指示存儲控制器執(zhí)行寫數(shù)據(jù)的存儲操作的狀態(tài)。具體地,存儲控制單元對存儲介質(zhì)進(jìn)行塊存儲之后,向NVMe操作處理單元返回操作狀態(tài)信息,再由NVMe操作處理單元提交操作狀態(tài)信息至NVMe命令處理單元,由NVMe命令處理單元寫操作狀態(tài)信息至NVMe完成隊列。最后NVMe命令處理單元將NVMe完成隊列發(fā)送至服務(wù)器內(nèi)的NVMe命令轉(zhuǎn)換模塊。S610,服務(wù)器接收所述存儲控制器返回的操作狀態(tài)信息,所述操作狀態(tài)信息用于指示所述存儲控制器執(zhí)行所述存儲數(shù)據(jù)的存儲操作的狀態(tài)。具體實現(xiàn)中,NVMe命令轉(zhuǎn)換模塊從NVMe完成隊列中獲取提交操作狀態(tài)信息,將獲取到的提交操作狀態(tài)信息發(fā)送至塊層。塊層提交操作狀態(tài)信息到文件系統(tǒng),文件系統(tǒng)提交操作狀態(tài)信息到傳統(tǒng)應(yīng)用層模塊,處理結(jié)束。采用本發(fā)明實施例,利用協(xié)議指向的數(shù)據(jù)段來傳輸鍵值存儲的存儲請求隊列,存儲請求隊列中包含了存儲操作請求的操作類型、存儲指令序列的內(nèi)存地址、存儲類型標(biāo)識,存儲類型標(biāo)識用于指示存儲操作請求的存儲類型為鍵值存儲或者塊存儲,以使存儲控制器根據(jù)存儲請求隊列執(zhí)行相應(yīng)的存儲操作,減少多層存儲協(xié)議棧之間的轉(zhuǎn)換,縮短IO路徑和時延,提高鍵值存儲效率。此外,借助標(biāo)準(zhǔn)存儲協(xié)議,使得存儲控制系統(tǒng)或者存儲控制器同時具有鍵值存儲和塊存儲的特性。請參閱圖8,圖8是本發(fā)明實施例的服務(wù)器的另一實施例的結(jié)構(gòu)示意圖。圖8所示的服務(wù)器可通過圖1(a)和圖1(b)所示的服務(wù)器實現(xiàn),還可以通過專用集成電路(英文:application-specificintegratedcircuit,縮寫:ASIC)實現(xiàn),或可編程邏輯器件(英文:programmablelogicdevice,縮寫:PLD)實現(xiàn)。上述PLD可以是復(fù)雜可編程邏輯器件(英文:complexprogrammablelogicdevice,縮寫:CPLD),F(xiàn)PGA,通用陣列邏輯(英文:genericarraylogic,縮寫:GAL)或其任意組合。服務(wù)器用于實現(xiàn)圖2至圖7所示的存儲方法。通過軟件實現(xiàn)如圖2至圖7所示的存儲方法時,服務(wù)器也可以為軟件模塊。服務(wù)器可包括獲取模塊800、確定模塊801、生成模塊802、發(fā)送模塊803以及接收模塊804。獲取模塊800工作時,執(zhí)行圖2(a)所示的步驟S100、圖3(a)所示的步驟S200、圖4(a)所示的步驟S300、圖5(a)所示的步驟S400、圖6(a)所示的步驟S500以及圖7(a)所示的步驟S600。確定模塊801工作時,執(zhí)行圖2(a)所示的步驟S101、圖3(a)所示的步驟S201、圖4(a)所示的步驟S301、圖5(a)所示的步驟S401、圖6(a)所示的步驟S501以及圖7(a)所示的步驟S601。生成模塊802工作時,執(zhí)行圖2(a)所示的步驟S102、圖3(a)所示的步驟S202、圖4(a)所示的步驟S302、圖5(a)所示的步驟S402、圖6(a)所示的步驟S502以及圖7(a)所示的步驟S602。發(fā)送模塊803工作時,執(zhí)行圖2(a)所示的步驟S103、圖3(a)所示的步驟S203、圖4(a)所示的步驟S303、圖5(a)所示的步驟S403、圖6(a)所示的步驟S503以及圖7(a)所示的步驟S603。接收模塊804工作時,執(zhí)行圖3(a)所示的步驟S210、圖4(a)所示的步驟S310、圖5(a)所示的步驟S410、圖6(a)所示的步驟S510以及圖7(a)所示的步驟S610。采用本發(fā)明實施例,利用協(xié)議指向的數(shù)據(jù)段來傳輸鍵值存儲的存儲請求隊列,存儲請求隊列中包含了存儲操作請求的操作類型、存儲指令序列的內(nèi)存地址、存儲類型標(biāo)識,存儲類型標(biāo)識用于指示存儲操作請求的存儲類型為鍵值存儲或者塊存儲,以使存儲控制器根據(jù)存儲請求隊列執(zhí)行相應(yīng)的存儲操作,減少多層存儲協(xié)議棧之間的轉(zhuǎn)換,縮短IO路徑和時延,提高鍵值存儲效率。此外,借助標(biāo)準(zhǔn)存儲協(xié)議,使得存儲控制系統(tǒng)或者存儲控制器同時具有鍵值存儲和塊存儲的特性。請參閱圖9,圖9是本發(fā)明實施例的存儲控制器的另一實施例的結(jié)構(gòu)示意圖。圖8所示的存儲控制器可通過圖1(a)和圖1(b)所示的存儲控制器實現(xiàn),還可以通過專用集成電路(英文:application-specificintegratedcircuit,縮寫:ASIC)實現(xiàn),或可編程邏輯器件(英文:programmablelogicdevice,縮寫:PLD)實現(xiàn)。上述PLD可以是復(fù)雜可編程邏輯器件(英文:complexprogrammablelogicdevice,縮寫:CPLD),F(xiàn)PGA,通用陣列邏輯(英文:genericarraylogic,縮寫:GAL)或其任意組合。存儲控制器用于實現(xiàn)圖2至圖7所示的存儲方法。通過軟件實現(xiàn)如圖2至圖7所示的存儲方法時,存儲控制器也可以為軟件模塊。存儲控制器可包括獲取模塊900、執(zhí)行模塊901以及輸出模塊902,獲取模塊900工作時,執(zhí)行圖3(a)所示的步驟S204-S205、圖4(a)所示的步驟S304-S305、圖5(a)所示的步驟S404-S405、圖6(a)所示的步驟S504-S505以及圖7(a)所示的步驟S604-S605。執(zhí)行模塊901工作時,執(zhí)行圖3(a)所示的步驟S206-S208、圖4(a)所示的步驟S306-S308、圖5(a)所示的步驟S406-S408、圖6(a)所示的步驟S506-S508以及圖7(a)所示的步驟S606-S608。輸出模塊902工作時,執(zhí)行圖3(a)所示的步驟S209、圖4(a)所示的步驟S309、圖5(a)所示的步驟S409、圖6(a)所示的步驟S509以及圖7(a)所示的步驟S609。采用本發(fā)明實施例,利用協(xié)議指向的數(shù)據(jù)段來傳輸鍵值存儲的存儲請求隊列,存儲請求隊列中包含了存儲操作請求的操作類型、存儲指令序列的內(nèi)存地址、存儲類型標(biāo)識,存儲類型標(biāo)識用于指示存儲操作請求的存儲類型為鍵值存儲或者塊存儲,以使存儲控制器根據(jù)存儲請求隊列執(zhí)行相應(yīng)的存儲操作,減少多層存儲協(xié)議棧之間的轉(zhuǎn)換,縮短IO路徑和時延,提高鍵值存儲效率。此外,借助標(biāo)準(zhǔn)存儲協(xié)議,使得存儲控制系統(tǒng)或者存儲控制器同時具有鍵值存儲和塊存儲的特性。以上所描述的裝置實施例僅僅是示意性的,其中所述作為分離部件說明的單元可以是或者也可以不是物理上分開的,作為單元顯示的部件可以是或者也可以不是物理單元,即可以位于一個地方,或者也可以分布到多個網(wǎng)絡(luò)單元上??梢愿鶕?jù)實際的需要選擇其中的部分或者全部模塊來實現(xiàn)本實施例方案的目的。本領(lǐng)域普通技術(shù)人員在不付出創(chuàng)造性的勞動的情況下,即可以理解并實施。本發(fā)明實施例方法中的步驟可以根據(jù)實際需要進(jìn)行順序調(diào)整、合并和刪減。本發(fā)明實施例裝置中的模塊或單元可以根據(jù)實際需要進(jìn)行合并、劃分和刪減。本發(fā)明實施例的模塊或模塊,可以以通用集成電路(如中央處理器CPU),或以專用集成電路(ASIC)來實現(xiàn)。通過以上的實施方式的描述,本領(lǐng)域的技術(shù)人員可以清楚地了解到各實施方式可借助軟件加必需的通用硬件平臺的方式來實現(xiàn),當(dāng)然也可以通過硬件。基于這樣的理解,上述技術(shù)方案本質(zhì)上或者說對現(xiàn)有技術(shù)做出貢獻(xiàn)的部分可以以軟件產(chǎn)品的形式體現(xiàn)出來,該計算機(jī)軟件產(chǎn)品可以存儲在計算機(jī)可讀存儲介質(zhì)中,如ROM/RAM、磁碟、光盤等,包括若干指令用以使得一臺計算機(jī)設(shè)備(可以是個人計算機(jī),服務(wù)器,或者網(wǎng)絡(luò)設(shè)備等)執(zhí)行各個實施例或者實施例的某些部分所述的方法。以上所述的實施方式,并不構(gòu)成對該技術(shù)方案保護(hù)范圍的限定。任何在上述實施方式的精神和原則之內(nèi)所作的修改、等同替換和改進(jìn)等,均應(yīng)包含在該技術(shù)方案的保護(hù)范圍之內(nèi)。當(dāng)前第1頁1 2 3