本公開涉及計(jì)算機(jī)數(shù)據(jù)處理技術(shù)領(lǐng)域,特別涉及一種實(shí)現(xiàn)數(shù)據(jù)緩存的方法及裝置。
背景技術(shù):
db數(shù)據(jù)庫是一種關(guān)系數(shù)據(jù)庫,可嵌入到智能手機(jī)甚至是路由器中。db數(shù)據(jù)庫中的數(shù)據(jù)大都會(huì)進(jìn)行緩存,使得對(duì)數(shù)據(jù)的大部分操作都在緩存中進(jìn)行,因此訪問速度非常高效。
為了對(duì)db數(shù)據(jù)庫中持久化存儲(chǔ)的數(shù)據(jù)進(jìn)行緩存,現(xiàn)有技術(shù)一般由需要獲取數(shù)據(jù)的軟件app直接查詢緩存系統(tǒng)的緩存數(shù)據(jù),確定緩存系統(tǒng)中是否存在需要獲取的指定數(shù)據(jù)。如果緩存系統(tǒng)中不存在需要獲取的指定數(shù)據(jù),就由該軟件app直接到db數(shù)據(jù)庫中查詢獲取該指定數(shù)據(jù),然后由該軟件app直接將該指定數(shù)據(jù)存儲(chǔ)至緩存系統(tǒng)中,如圖1所示。對(duì)于需要緩存數(shù)據(jù)的軟件app而言,每一個(gè)軟件app內(nèi)均需設(shè)置直接訪問db數(shù)據(jù)庫和緩存系統(tǒng)的接口程序,才能實(shí)現(xiàn)將db數(shù)據(jù)庫中的數(shù)據(jù)緩存至緩存系統(tǒng)。
由軟件app直接訪問db數(shù)據(jù)庫并緩存數(shù)據(jù),則針對(duì)每一個(gè)需要緩存數(shù)據(jù)的軟件app來說需要獨(dú)立開發(fā)數(shù)據(jù)訪問程序,開發(fā)成本較高。
技術(shù)實(shí)現(xiàn)要素:
為了解決相關(guān)技術(shù)中存在的針對(duì)每一個(gè)需要緩存數(shù)據(jù)的軟件app來說需要獨(dú)立開發(fā)數(shù)據(jù)訪問程序,開發(fā)成本較高的問題,本公開提供一種實(shí)現(xiàn)數(shù)據(jù)緩存的方法。
基于此,本公開提供了一種實(shí)現(xiàn)數(shù)據(jù)緩存的方法,所述方法應(yīng)用于數(shù)據(jù)訪問接口程序,所述數(shù)據(jù)訪問接口程序作為外部實(shí)現(xiàn)持久化存儲(chǔ)的數(shù)據(jù)和緩存數(shù)據(jù)訪問的接口,所述方法包括:
接收外部所發(fā)起對(duì)數(shù)據(jù)觸發(fā)的查詢請(qǐng)求;
根據(jù)所述查詢請(qǐng)求在所述緩存數(shù)據(jù)中執(zhí)行數(shù)據(jù)查詢操作,獲得所述數(shù)據(jù)不存在的查詢結(jié)果;
根據(jù)所述查詢結(jié)果,按照所述查詢請(qǐng)求對(duì)所述持久化存儲(chǔ)的數(shù)據(jù)執(zhí)行數(shù)據(jù)查詢操作,獲得請(qǐng)求的所述數(shù)據(jù);
對(duì)獲得的所述數(shù)據(jù)進(jìn)行緩存,形成所述數(shù)據(jù)的所述緩存數(shù)據(jù)。
另一方面,本公開還提供了了一種實(shí)現(xiàn)數(shù)據(jù)緩存的裝置,所述裝置應(yīng)用于數(shù)據(jù)訪問接口,所述數(shù)據(jù)訪問接口作為外部實(shí)現(xiàn)持久化存儲(chǔ)的數(shù)據(jù)和緩存數(shù)據(jù)訪問的接口,所述裝置包括:
查詢請(qǐng)求接收模塊,用于接收外部所發(fā)起對(duì)數(shù)據(jù)觸發(fā)的查詢請(qǐng)求;
數(shù)據(jù)查詢模塊,用于根據(jù)所述查詢請(qǐng)求在所述緩存數(shù)據(jù)中執(zhí)行數(shù)據(jù)查詢操作,獲得所述數(shù)據(jù)不存在的查詢結(jié)果;
數(shù)據(jù)請(qǐng)求模塊,用于根據(jù)所述查詢結(jié)果,按照所述查詢請(qǐng)求對(duì)所述持久化存儲(chǔ)的數(shù)據(jù)執(zhí)行數(shù)據(jù)查詢操作,獲得請(qǐng)求的所述數(shù)據(jù);
數(shù)據(jù)緩存模塊,用于對(duì)獲得的所述數(shù)據(jù)進(jìn)行緩存,形成所述數(shù)據(jù)的所述緩存數(shù)據(jù)。
本公開的實(shí)施例提供的技術(shù)方案可以包括以下有益效果:
本公開示例性實(shí)施例提供的實(shí)現(xiàn)數(shù)據(jù)緩存的方法及裝置,通過數(shù)據(jù)訪問接口程序作為外部實(shí)現(xiàn)持久化存儲(chǔ)的數(shù)據(jù)和緩存數(shù)據(jù)訪問的接口,從而無需對(duì)每個(gè)需要緩存數(shù)據(jù)的外部設(shè)備單獨(dú)開發(fā)緩存數(shù)據(jù)的程序,通過通用的數(shù)據(jù)訪問接口程序即可實(shí)現(xiàn)數(shù)據(jù)的緩存,從而節(jié)省了人力,節(jié)約了開發(fā)成本。
應(yīng)當(dāng)理解的是,以上的一般描述和后文的細(xì)節(jié)描述僅是示例性的,并不能限制本公開。
附圖說明
此處的附圖被并入說明書中并構(gòu)成本說明書的一部分,示出了符合本發(fā)明的實(shí)施例,并于說明書一起用于解釋本發(fā)明的原理。
圖1是現(xiàn)有技術(shù)實(shí)現(xiàn)數(shù)據(jù)緩存的方案的原理示意圖;
圖2是根據(jù)一示例性實(shí)施例示出的一種實(shí)現(xiàn)數(shù)據(jù)緩存的方法的流程圖;
圖3是根據(jù)一示例性實(shí)施例示出的一種實(shí)現(xiàn)數(shù)據(jù)緩存的方法的架構(gòu)圖;
圖4是根據(jù)一示例性實(shí)施例示出的對(duì)步驟s250的細(xì)節(jié)進(jìn)行描述的流程示意圖
圖5是根據(jù)另一示例性實(shí)施例示出的一種實(shí)現(xiàn)數(shù)據(jù)緩存的方法的架構(gòu)圖;
圖6是根據(jù)一示例性實(shí)施例示出的一種實(shí)現(xiàn)數(shù)據(jù)緩存的方法的時(shí)序圖;
圖7是根據(jù)另一示例性實(shí)施例示出的一種實(shí)現(xiàn)數(shù)據(jù)緩存的方法的流程圖;
圖8是根據(jù)圖7對(duì)應(yīng)實(shí)施例的步驟s701和步驟s702對(duì)數(shù)據(jù)執(zhí)行修改操作的時(shí)序圖;
圖9是根據(jù)又一示例性實(shí)施例示出的一種實(shí)現(xiàn)數(shù)據(jù)緩存的方法的流程圖;
圖10是根據(jù)圖9對(duì)應(yīng)實(shí)施例的步驟s901和步驟s902對(duì)數(shù)據(jù)執(zhí)行刪除操作的時(shí)序圖;
圖11是根據(jù)再一示例性實(shí)施例示出的一種實(shí)現(xiàn)數(shù)據(jù)緩存的方法的流程圖;
圖12為根據(jù)圖11對(duì)應(yīng)實(shí)施例示出的完成步驟s1101-s1102的數(shù)據(jù)刪除操作的時(shí)序圖;
圖13是根據(jù)本公開所涉及的實(shí)施環(huán)境的示意圖;
圖14是根據(jù)一示例性實(shí)施例示出的一種實(shí)現(xiàn)數(shù)據(jù)緩存的裝置的框圖;
圖15是根據(jù)圖14對(duì)應(yīng)示例性實(shí)施例示出的數(shù)據(jù)請(qǐng)求模塊的框圖。
具體實(shí)施方式
這里將詳細(xì)地對(duì)示例性實(shí)施例執(zhí)行說明,其示例表示在附圖中。下面的描述涉及附圖時(shí),除非另有表示,不同附圖中的相同數(shù)字表示相同或相似的要素。以下示例性實(shí)施例中所描述的實(shí)施方式并不代表與本發(fā)明相一致的所有實(shí)施方式。相反,它們僅是與如所附權(quán)利要求書中所詳述的、本發(fā)明的一些方面相一致的裝置和方法的例子。
圖2是根據(jù)一示例性實(shí)施例示出的一種實(shí)現(xiàn)數(shù)據(jù)緩存的方法的流程圖。該實(shí)現(xiàn)數(shù)據(jù)緩存的方法的適用范圍和執(zhí)行主體,例如,可以是服務(wù)器,該服務(wù)器中配置有數(shù)據(jù)訪問接口程序,該實(shí)現(xiàn)數(shù)據(jù)緩存的方法將用于實(shí)現(xiàn)數(shù)據(jù)訪問接口程序,該數(shù)據(jù)訪問接口程序作為外部實(shí)現(xiàn)持久化存儲(chǔ)的數(shù)據(jù)和緩存數(shù)據(jù)訪問的接口。
需要說明的是,持久化是針對(duì)時(shí)間而言的,在一定周期內(nèi)保持不變就是持久化。持久化存儲(chǔ)的數(shù)據(jù)是指只要不去刪除或修改,持久保存在存儲(chǔ)設(shè)備中的數(shù)據(jù)。其中,持久化存儲(chǔ)的數(shù)據(jù)包括存儲(chǔ)在關(guān)系型數(shù)據(jù)庫中,存儲(chǔ)在磁盤文件中、xml(可擴(kuò)展標(biāo)記語言)數(shù)據(jù)文件中的數(shù)據(jù)。舉例來說,該持久化存儲(chǔ)的數(shù)據(jù)可以位于數(shù)據(jù)庫中,如db數(shù)據(jù)庫;該緩存數(shù)據(jù)可以位于緩存系統(tǒng)中,該數(shù)據(jù)訪問接口程序可以作為外部(如應(yīng)用程序)訪問db數(shù)據(jù)庫和緩存系統(tǒng)的接口。
如圖2所示,本公開一示例性實(shí)施例示出的一種實(shí)現(xiàn)數(shù)據(jù)緩存的方法,可以包括以下步驟:
步驟s210:接收外部所發(fā)起對(duì)數(shù)據(jù)觸發(fā)的查詢請(qǐng)求;
需要說明的是,此處的外部是相對(duì)數(shù)據(jù)而言的,可以是與服務(wù)器連接的智能設(shè)備,或者服務(wù)器內(nèi)部需要訪問數(shù)據(jù)的軟件app(應(yīng)用程序),又或者可以是服務(wù)器內(nèi)部其他需要訪問持久化存儲(chǔ)的數(shù)據(jù)和緩存數(shù)據(jù)的組件,如處理器。本公開實(shí)施例將軟件app作為外部進(jìn)行說明,其他的外部智能設(shè)備、服務(wù)器組件可以參照外部為軟件app的情況執(zhí)行。
具體的,服務(wù)器內(nèi)部配置有數(shù)據(jù)訪問接口程序和軟件app,軟件app在要進(jìn)行數(shù)據(jù)訪問時(shí),會(huì)向接口發(fā)起查詢請(qǐng)求,數(shù)據(jù)訪問接口程序相應(yīng)接收到軟件app發(fā)起的查詢請(qǐng)求。其中,該數(shù)據(jù)可以是kv數(shù)據(jù)(key-value,鍵-值對(duì)數(shù)據(jù))的存儲(chǔ)形式進(jìn)行持久化存儲(chǔ)。該查詢請(qǐng)求中攜帶與該數(shù)據(jù)相對(duì)應(yīng)的key(關(guān)鍵字)標(biāo)識(shí),以按照此key標(biāo)識(shí)執(zhí)行相應(yīng)的數(shù)據(jù)查詢操作。
步驟s230:根據(jù)所述查詢請(qǐng)求在所述緩存數(shù)據(jù)中執(zhí)行數(shù)據(jù)查詢操作,獲得所述數(shù)據(jù)不存在的查詢結(jié)果;
其中,以實(shí)際應(yīng)用場(chǎng)景舉例來說,如圖3所示,該軟件app可以位于服務(wù)器的應(yīng)用層,該數(shù)據(jù)訪問程序可以位于服務(wù)器的接口層,該緩存數(shù)據(jù)可以位于服務(wù)器存儲(chǔ)層配置的緩存系統(tǒng)中。根據(jù)需要,也可以將緩存數(shù)據(jù)直接存儲(chǔ)在數(shù)據(jù)訪問接口程序的本地內(nèi)存中。
具體的,數(shù)據(jù)訪問接口程序接收到軟件app發(fā)送的查詢請(qǐng)求,由于該查詢請(qǐng)求攜帶了key標(biāo)識(shí),數(shù)據(jù)訪問接口程序根據(jù)key標(biāo)識(shí)在緩存數(shù)據(jù)中執(zhí)行數(shù)據(jù)查詢操作,查詢與該key標(biāo)識(shí)對(duì)應(yīng)的數(shù)據(jù)。如果數(shù)據(jù)訪問接口程序獲得的查詢結(jié)果是該緩存數(shù)據(jù)中不包括與key標(biāo)識(shí)對(duì)應(yīng)的數(shù)據(jù),那么執(zhí)行后續(xù)步驟s250、s270進(jìn)行數(shù)據(jù)緩存。如果查詢結(jié)果是該緩存數(shù)據(jù)中包括與key標(biāo)識(shí)對(duì)應(yīng)的數(shù)據(jù),則表示該數(shù)據(jù)已經(jīng)完成了緩存。
步驟s250:根據(jù)所述查詢結(jié)果,按照所述查詢請(qǐng)求對(duì)所述持久化存儲(chǔ)的數(shù)據(jù)執(zhí)行數(shù)據(jù)查詢操作,獲得請(qǐng)求的所述數(shù)據(jù);
舉例來說,如圖3所示,該持久化存儲(chǔ)的數(shù)據(jù)可以位于db數(shù)據(jù)庫中,而db數(shù)據(jù)庫可以與緩存系統(tǒng)一并配置在服務(wù)器的存儲(chǔ)層。具體的,在步驟s230獲得了不存在所述數(shù)據(jù)的查詢結(jié)果后,數(shù)據(jù)訪問接口程序按照查詢請(qǐng)求,根據(jù)查詢請(qǐng)求中攜帶的key標(biāo)識(shí),在db數(shù)據(jù)庫的持久化存儲(chǔ)的數(shù)據(jù)中執(zhí)行數(shù)據(jù)查詢操作,獲取與查詢請(qǐng)求中的key標(biāo)識(shí)對(duì)應(yīng)的數(shù)據(jù)。
步驟s270:對(duì)獲得的所述數(shù)據(jù)進(jìn)行緩存,形成所述數(shù)據(jù)的所述緩存數(shù)據(jù)。
其中,如圖3所示,數(shù)據(jù)訪問接口程序從持久化存儲(chǔ)的數(shù)據(jù)中獲取到了所查詢的數(shù)據(jù)之后,就對(duì)該數(shù)據(jù)進(jìn)行緩存,形成緩存數(shù)據(jù)。具體的,可以將該數(shù)據(jù)緩存至存儲(chǔ)層的緩存系統(tǒng)中,或者數(shù)據(jù)訪問接口程序的本地內(nèi)存中。進(jìn)一步的,可以以鍵值對(duì)的形式實(shí)現(xiàn)數(shù)據(jù)緩存。
現(xiàn)有技術(shù)中由于每個(gè)軟件app直接訪問db數(shù)據(jù)庫和緩存系統(tǒng),所以對(duì)于需要緩存數(shù)據(jù)的軟件app而言,每個(gè)軟件app需要獨(dú)立開發(fā)緩存數(shù)據(jù)的程序,開發(fā)成本較高,浪費(fèi)人力成本,上述示例性實(shí)施例提供的實(shí)現(xiàn)數(shù)據(jù)緩存的方法,不再由軟件app直接訪問db數(shù)據(jù)庫和緩存系統(tǒng),由通用的數(shù)據(jù)訪問接口程序作為訪問db數(shù)據(jù)庫和緩存系統(tǒng)的接口,由此,每個(gè)軟件app無需獨(dú)立開發(fā),只需通過通用的數(shù)據(jù)訪問接口程序即可實(shí)現(xiàn)db數(shù)據(jù)庫和緩存系統(tǒng)的訪問,實(shí)現(xiàn)數(shù)據(jù)的緩存。
本公開示例性實(shí)施例提供的實(shí)現(xiàn)數(shù)據(jù)緩存的方法,通過數(shù)據(jù)訪問接口程序作為外部實(shí)現(xiàn)持久化存儲(chǔ)的數(shù)據(jù)和緩存數(shù)據(jù)訪問的接口,從而無需對(duì)每個(gè)需要緩存數(shù)據(jù)的外部設(shè)備單獨(dú)開發(fā)緩存數(shù)據(jù)的程序,通過通用的數(shù)據(jù)訪問接口程序即可實(shí)現(xiàn)數(shù)據(jù)的緩存,從而節(jié)省了人力,節(jié)約了開發(fā)成本。
圖4是根據(jù)本公開一示例性實(shí)施例示出的對(duì)步驟s250根據(jù)所述查詢結(jié)果,按照查詢請(qǐng)求對(duì)所述持久化存儲(chǔ)的數(shù)據(jù)執(zhí)行數(shù)據(jù)查詢操作,獲得請(qǐng)求的所述數(shù)據(jù)的細(xì)節(jié)進(jìn)行描述的流程示意圖,如圖4所示,該步驟s250具體可以包括以下步驟:
步驟s401:解析接收的所述查詢請(qǐng)求得到數(shù)據(jù)庫查詢參數(shù);
需要說明的是,以查詢kv數(shù)據(jù)而言,該查詢請(qǐng)求攜帶了key標(biāo)識(shí)。在緩存數(shù)據(jù)中不存在與key標(biāo)識(shí)對(duì)應(yīng)的指定數(shù)據(jù)時(shí),需要從持久化存儲(chǔ)的數(shù)據(jù)中來獲取該指定數(shù)據(jù)。
具體的,以該持久化存儲(chǔ)的數(shù)據(jù)位于db數(shù)據(jù)庫為例進(jìn)行說,數(shù)據(jù)訪問接口程序解析查詢請(qǐng)求中攜帶的key標(biāo)識(shí),得到查詢db數(shù)據(jù)庫所需的參數(shù)。
步驟s402:根據(jù)解析得到的所述數(shù)據(jù)庫查詢參數(shù)以及指定數(shù)據(jù)庫查詢指令的格式,生成數(shù)據(jù)庫查詢指令;
其中,指定數(shù)據(jù)庫查詢指令的格式可以為sql(結(jié)構(gòu)化查詢語言)語句格式。具體的,根據(jù)解析得到的查詢db數(shù)據(jù)所需的參數(shù),生成對(duì)應(yīng)的presql(預(yù)定義sql模板,用于參數(shù)替換后生成sql語句)請(qǐng)求,然后根據(jù)sql模板和查詢db數(shù)據(jù)所需的參數(shù),生成sql語句,即數(shù)據(jù)庫查詢指令,到db數(shù)據(jù)庫查詢數(shù)據(jù)。
需要解釋的是,key標(biāo)識(shí)轉(zhuǎn)換為presql請(qǐng)求的技術(shù)。將kv數(shù)據(jù)緩存和db數(shù)據(jù)結(jié)合起來的關(guān)鍵是:數(shù)據(jù)在緩存系統(tǒng)不存在時(shí),根據(jù)key標(biāo)識(shí),可以提取出presql需要的參數(shù),轉(zhuǎn)化為presql請(qǐng)求,然后緩存結(jié)果。
具體的,可以規(guī)定kv數(shù)據(jù)key標(biāo)識(shí)的格式,再配置出根據(jù)組成key標(biāo)識(shí)的字段為條件的presql,那么在需要時(shí),就可以從key標(biāo)識(shí)中提取presql需要的參數(shù)值。只要在kv數(shù)據(jù)的配置項(xiàng)中,增加對(duì)應(yīng)的presql_id(預(yù)定義sql模板標(biāo)識(shí))配置,key標(biāo)識(shí)格式等信息,就可以通過配置實(shí)現(xiàn)數(shù)據(jù)緩存了。
步驟s403:在被數(shù)據(jù)庫持久化存儲(chǔ)的數(shù)據(jù)中執(zhí)行所述數(shù)據(jù)庫查詢指令獲得請(qǐng)求的所述數(shù)據(jù)。
需要說明的是,數(shù)據(jù)庫查詢指令(sql語句)是根據(jù)key標(biāo)識(shí)生成,因此,根據(jù)數(shù)據(jù)庫查詢指令在db數(shù)據(jù)庫中執(zhí)行數(shù)據(jù)查詢操作時(shí),可以獲得與查詢請(qǐng)求中的key標(biāo)識(shí)對(duì)應(yīng)的數(shù)據(jù),即獲得所請(qǐng)求的數(shù)據(jù)。
在獲得了所請(qǐng)求的數(shù)據(jù)后,將該數(shù)據(jù)進(jìn)行緩存,形成緩存數(shù)據(jù)。當(dāng)后續(xù)接收到同一個(gè)key標(biāo)識(shí)的查詢請(qǐng)求時(shí),即可從緩存數(shù)據(jù)中獲得該數(shù)據(jù),不必再到數(shù)據(jù)庫中進(jìn)行查詢,實(shí)現(xiàn)緩存目的,提高了數(shù)據(jù)訪問效率。
圖5是根據(jù)本公開另一示例性實(shí)施例示出的一種實(shí)現(xiàn)數(shù)據(jù)緩存的方法的架構(gòu)圖,其中,如圖5所示,軟件app設(shè)置在應(yīng)用層,數(shù)據(jù)訪問接口程序設(shè)置在接口層,緩存系統(tǒng)和db數(shù)據(jù)庫設(shè)置在存儲(chǔ)層;數(shù)據(jù)訪問接口程序可以包括datasvr程序(提供kv數(shù)據(jù)訪問接口的程序,通過將請(qǐng)求轉(zhuǎn)換為對(duì)應(yīng)緩存系統(tǒng)的命令實(shí)現(xiàn)數(shù)據(jù)存取)和dbproxy程序(代理訪問db數(shù)據(jù)庫的服務(wù)程序)。持久化存儲(chǔ)的數(shù)據(jù)可以位于db數(shù)據(jù)中,緩存數(shù)據(jù)可以位于緩存系統(tǒng)中,該數(shù)據(jù)訪問接口程序作為外部(如軟件app)訪問db數(shù)據(jù)和緩存系統(tǒng)的接口。
根據(jù)如圖5所示的架構(gòu)圖,實(shí)現(xiàn)數(shù)據(jù)緩存的具體流程如下:
1、datasvr接收軟件app發(fā)送的查詢請(qǐng)求。
2、datasvr根據(jù)查詢請(qǐng)求在緩存系統(tǒng)中查詢指定的數(shù)據(jù)。如果存在該指定的數(shù)據(jù),直接向軟件app返回;
3、如果緩存系統(tǒng)中不存在該指定的數(shù)據(jù),datasvr生成presql請(qǐng)求發(fā)送至dbproxy;
4、dbproxy接收presql請(qǐng)求在db數(shù)據(jù)庫中查詢并獲得該指定的數(shù)據(jù);
5、datasvr將dbproxy查詢得到的該指定的數(shù)據(jù)緩存至緩存系統(tǒng)中,實(shí)現(xiàn)數(shù)據(jù)緩存的目的。
需要說明的是,datasvr程序提供統(tǒng)一的kv數(shù)據(jù)訪問接口,支持使用多種緩存系統(tǒng)存儲(chǔ)kv數(shù)據(jù),如開源的redis(key-value存儲(chǔ)系統(tǒng))、memcached(分布式高速緩存系統(tǒng))。kv數(shù)據(jù)訪問接口是提供訪問key-value鍵值對(duì)數(shù)據(jù)的接口,有g(shù)et(查詢)、set(設(shè)置)和del(刪除)接口。
其中,get接口用于根據(jù)key從緩存系統(tǒng)查詢數(shù)據(jù)并返回value(值,即數(shù)據(jù))。set接口用于存儲(chǔ)key-value鍵值對(duì)到緩存系統(tǒng)。del接口用于從緩存系統(tǒng)刪除指定key的鍵值對(duì)數(shù)據(jù)。
另外需要說明的是,dbproxy提供預(yù)先定義的sql模板和對(duì)應(yīng)db數(shù)據(jù)庫信息;其中,為每個(gè)sql模板分配唯一的id(標(biāo)識(shí)),即稱之為presql_id。dbproxy接收presql請(qǐng)求后,使用presql_id指明要訪問的sql模板,同時(shí)填寫sql模板需要的參數(shù)。dbproxy根據(jù)sql模板和收到的參數(shù)(即解析key標(biāo)識(shí)得到的查詢數(shù)據(jù)庫所需的參數(shù)),組裝出完整的sql語句,到對(duì)應(yīng)的db數(shù)據(jù)庫中執(zhí)行查詢操作,并返回結(jié)果。
使用presql技術(shù),可以在不用重新啟動(dòng)dbproxy程序的情況下,支持新的db數(shù)據(jù)庫訪問需求。將添加新的db數(shù)據(jù)庫訪問需求轉(zhuǎn)化為參數(shù)配置這一運(yùn)維任務(wù),極大的提升工作效率和提高程序穩(wěn)定性。
圖6是根據(jù)本公開一示例性實(shí)施例示出的一種實(shí)現(xiàn)數(shù)據(jù)緩存的方法的時(shí)序圖,參照?qǐng)D6所示,本公開提供的實(shí)現(xiàn)數(shù)據(jù)緩存的方法的詳細(xì)過程包括以下步驟:
1、軟件app發(fā)送查詢請(qǐng)求到datasvr,該查詢請(qǐng)求攜帶與所查詢的數(shù)據(jù)對(duì)應(yīng)的key標(biāo)識(shí)。
2、datasvr到緩存系統(tǒng)查詢key標(biāo)識(shí)對(duì)應(yīng)的數(shù)據(jù)。
3、datasvr等待和接收緩存系統(tǒng)應(yīng)答,如果查詢到數(shù)據(jù),轉(zhuǎn)9直接返回查詢結(jié)果,否則轉(zhuǎn)4。如果等待超時(shí),也轉(zhuǎn)9。
4、datasvr從key標(biāo)識(shí)解析出db數(shù)據(jù)庫查詢參數(shù),組合presql請(qǐng)求,發(fā)送請(qǐng)求到dbproxy程序。
5、dbproxy根據(jù)presql模版和db數(shù)據(jù)庫查詢參數(shù),生成sql語句,到對(duì)應(yīng)db數(shù)據(jù)庫查詢,并返回結(jié)果。
6、datasvr等待和接收dbproxy的查詢結(jié)果,如果查詢到數(shù)據(jù),轉(zhuǎn)7,否者轉(zhuǎn)9。如果等待超時(shí),也轉(zhuǎn)9。
7、datasvr存儲(chǔ)key-value數(shù)據(jù)到緩存系統(tǒng),key為查詢請(qǐng)求中的key標(biāo)識(shí),value為查詢db數(shù)據(jù)庫獲得的數(shù)據(jù)。
8、datasvr等待和接收緩存系統(tǒng)設(shè)置key-value應(yīng)答,不管是否接收到應(yīng)答或者應(yīng)答超時(shí),不影響給軟件app返回查詢的數(shù)據(jù)。
9、datasvr向軟件app返回?cái)?shù)據(jù)查詢結(jié)果。如,查詢失敗或者返回查詢到的數(shù)據(jù)。
進(jìn)一步的,為了保證某一數(shù)據(jù)在緩存數(shù)據(jù)和持久化存儲(chǔ)的數(shù)據(jù)中的一致性,本公開還提供了另一種實(shí)現(xiàn)數(shù)據(jù)緩存的方法,該方法在上述任一示例性實(shí)施例的基礎(chǔ)上,如圖7所示,還包括以下步驟:
步驟s701:接收觸發(fā)進(jìn)行數(shù)據(jù)修改的請(qǐng)求;
舉例來說,在步驟s210-s270完成數(shù)據(jù)緩存后,數(shù)據(jù)訪問接口程序接收軟件app發(fā)送的觸發(fā)進(jìn)行數(shù)據(jù)修改的請(qǐng)求;其中,該請(qǐng)求攜帶key標(biāo)識(shí)。
步驟s702:根據(jù)所述觸發(fā)進(jìn)行數(shù)據(jù)修改的請(qǐng)求,向所述持久化存儲(chǔ)的數(shù)據(jù)執(zhí)行數(shù)據(jù)修改操作,相應(yīng)對(duì)所述數(shù)據(jù)的緩存數(shù)據(jù)執(zhí)行數(shù)據(jù)刪除操作。
具體的,數(shù)據(jù)訪問接口程序可以根據(jù)key標(biāo)識(shí),在持久化存儲(chǔ)的數(shù)據(jù)中對(duì)與key標(biāo)識(shí)對(duì)應(yīng)的數(shù)據(jù)執(zhí)行修改操作。由于持久化存儲(chǔ)的數(shù)據(jù)中與key標(biāo)識(shí)對(duì)應(yīng)的數(shù)據(jù)發(fā)生了修改,為了保證該數(shù)據(jù)在緩存數(shù)據(jù)和持久化存儲(chǔ)的數(shù)據(jù)中的一致性,刪除緩存數(shù)據(jù)中與key標(biāo)識(shí)對(duì)應(yīng)的數(shù)據(jù)。之后根據(jù)需要,可以繼續(xù)執(zhí)行步驟s210-s270,實(shí)現(xiàn)修改后數(shù)據(jù)的緩存。
圖8是根據(jù)步驟s701和步驟s702對(duì)數(shù)據(jù)執(zhí)行修改操作的時(shí)序圖,為了更加清楚地理解本示例性實(shí)施例提供的技術(shù)方案,該示例性實(shí)施例以持久化存儲(chǔ)的數(shù)據(jù)位于db數(shù)據(jù)庫、緩存數(shù)據(jù)位于緩存系統(tǒng)為例進(jìn)行說明,該持久化存儲(chǔ)的數(shù)據(jù)位于其他數(shù)據(jù)庫中的情形,或該緩存數(shù)據(jù)位于其他存儲(chǔ)單元中的情形可以參照該示例性實(shí)施例進(jìn)行。此外,外部對(duì)數(shù)據(jù)的訪問,以軟件app進(jìn)行數(shù)據(jù)訪問為例進(jìn)行說明。
如圖8所示,對(duì)數(shù)據(jù)執(zhí)行修改操作包括以下步驟:
1、軟件app發(fā)送設(shè)置kv數(shù)據(jù)請(qǐng)求到datasvr;需要說明的是,該設(shè)置kv數(shù)據(jù)請(qǐng)求即為上述示例性實(shí)施例中觸發(fā)進(jìn)行數(shù)據(jù)修改的請(qǐng)求。該設(shè)置kv數(shù)據(jù)請(qǐng)求攜帶key標(biāo)識(shí)。
2、datasvr通過key標(biāo)識(shí)解析出設(shè)置數(shù)據(jù)到db數(shù)據(jù)庫的presql需要的參數(shù),生成presql請(qǐng)求發(fā)送至dbproxy。
3、dbproxy根據(jù)presql請(qǐng)求確定設(shè)置數(shù)據(jù)的sql模版和傳入的參數(shù),生成sql語句,到對(duì)應(yīng)db數(shù)據(jù)庫上執(zhí)行設(shè)置操作。這個(gè)presql可以支持新數(shù)據(jù)的插入和已有數(shù)據(jù)的部分字段修改。
4、dbprox向datasvry返回執(zhí)行設(shè)置操作的結(jié)果。
5、如果修改db數(shù)據(jù)庫的數(shù)據(jù)成功,datasvry從緩存系統(tǒng)刪除與key標(biāo)識(shí)對(duì)應(yīng)的數(shù)據(jù)。
6、datasvr向軟件app返回修改數(shù)據(jù)的結(jié)果。
為了保證某一數(shù)據(jù)在緩存數(shù)據(jù)和持久化存儲(chǔ)的數(shù)據(jù)中的一致性,本公開還提供了另一種實(shí)現(xiàn)數(shù)據(jù)緩存的方法,該方法在上述任一示例性實(shí)施例的基礎(chǔ)上,如圖9所示,還包括以下步驟:
步驟s901:接收觸發(fā)進(jìn)行數(shù)據(jù)刪除的請(qǐng)求;
舉例來說,在步驟s210-s270完成數(shù)據(jù)緩存后,數(shù)據(jù)訪問接口程序接收軟件app發(fā)送的觸發(fā)進(jìn)行數(shù)據(jù)刪除的請(qǐng)求;其中,該請(qǐng)求攜帶key標(biāo)識(shí)。
步驟s902:根據(jù)所述觸發(fā)進(jìn)行數(shù)據(jù)刪除的請(qǐng)求,向所述持久化存儲(chǔ)的數(shù)據(jù)執(zhí)行數(shù)據(jù)刪除操作,相應(yīng)對(duì)所述數(shù)據(jù)的緩存數(shù)據(jù)執(zhí)行數(shù)據(jù)刪除操作。
具體的,數(shù)據(jù)訪問接口程序可以根據(jù)key標(biāo)識(shí),在持久化存儲(chǔ)的數(shù)據(jù)中對(duì)與key標(biāo)識(shí)對(duì)應(yīng)的數(shù)據(jù)執(zhí)行刪除操作。由于持久化存儲(chǔ)的數(shù)據(jù)中與key標(biāo)識(shí)對(duì)應(yīng)的數(shù)據(jù)發(fā)生了刪除,因此可以刪除緩存數(shù)據(jù)中與key標(biāo)識(shí)對(duì)應(yīng)的數(shù)據(jù)。
以實(shí)際應(yīng)用場(chǎng)景舉例來說,執(zhí)行上述數(shù)據(jù)刪除操作的時(shí)序圖如圖10所示,具體流程如下:
1、軟件app發(fā)送刪除kv數(shù)據(jù)請(qǐng)求到datasvr;具體的,該刪除kv數(shù)據(jù)請(qǐng)求可以包括key標(biāo)識(shí)。
2、datasvr根據(jù)key標(biāo)識(shí)解析出刪除數(shù)據(jù)的presql需要的參數(shù),發(fā)送presql請(qǐng)求到dbproxy。
3、dbproxy根據(jù)presql請(qǐng)求,確定刪除數(shù)據(jù)的sql模版和傳入?yún)?shù),生成sql語言,到對(duì)應(yīng)db數(shù)據(jù)庫將與key標(biāo)識(shí)對(duì)應(yīng)的數(shù)據(jù)執(zhí)行刪除操作。
4、dbproxy返回刪除數(shù)據(jù)結(jié)果到datasvr。
5、如果刪除數(shù)據(jù)成功,datasvr從緩存系統(tǒng)刪除對(duì)應(yīng)key標(biāo)識(shí)的數(shù)據(jù)。
6、datasvr向軟件app返回刪除kv數(shù)據(jù)結(jié)果。
此外,當(dāng)外部直接對(duì)持久化存儲(chǔ)的數(shù)據(jù)進(jìn)行了修改或刪除操作,未通過數(shù)據(jù)訪問接口程序?qū)Τ志没鎯?chǔ)的數(shù)據(jù)執(zhí)行修改或刪除操作時(shí),如圖11所示,本公開另一示例性實(shí)施例提供的實(shí)現(xiàn)數(shù)據(jù)緩存的方法,在上述步驟s210-s270的基礎(chǔ)上,還包括以下步驟:
步驟s1101:接收進(jìn)行持久化存儲(chǔ)的所述數(shù)據(jù)已發(fā)生變更的通知;
具體的,在軟件app直接對(duì)持久化存儲(chǔ)的數(shù)據(jù)發(fā)生修改或刪除后,數(shù)據(jù)訪問接口程序接收軟件app發(fā)送的指定數(shù)據(jù)已發(fā)生變更的通知;其中,該通知可以攜帶該指定數(shù)據(jù)的key標(biāo)識(shí)。其中,進(jìn)行持久化存儲(chǔ)的所述數(shù)據(jù)可以位于db數(shù)據(jù)庫中。
步驟s1102:根據(jù)所述通知對(duì)所述數(shù)據(jù)的緩存數(shù)據(jù)執(zhí)行數(shù)據(jù)刪除操作。
具體的,數(shù)據(jù)訪問接口程序接收到該通知后,可以根據(jù)該key標(biāo)識(shí),將緩存數(shù)據(jù)中與該key標(biāo)識(shí)對(duì)應(yīng)的數(shù)據(jù)執(zhí)行數(shù)據(jù)刪除操作。其中,該緩存數(shù)據(jù)可以位于緩存系統(tǒng)中。
以實(shí)際場(chǎng)景舉例來說,圖12為本公開一示例性實(shí)施例示出的完成上述步驟s1101-s1102的數(shù)據(jù)刪除操作的時(shí)序圖,如圖12所示,完成上述步驟s1101-s1102的數(shù)據(jù)刪除操作的詳細(xì)過程包括以下步驟:
1、軟件app直接修改或者刪除db數(shù)據(jù)庫中的指定數(shù)據(jù);
2、軟件app向datasvr發(fā)送該指定數(shù)據(jù)已發(fā)生變更的通知,通知datasvrdb數(shù)據(jù)庫的數(shù)據(jù)變更。其中,該通知中攜帶了該指定數(shù)據(jù)對(duì)應(yīng)的key標(biāo)識(shí);
3、datasvr根據(jù)該通知,刪除緩存系統(tǒng)中與該key標(biāo)識(shí)對(duì)應(yīng)的緩存數(shù)據(jù)。
參見圖13,圖13是本公開示例性實(shí)施例提供的一種服務(wù)器結(jié)構(gòu)示意圖。該服務(wù)器1300可因配置或性能不同而產(chǎn)生比較大的差異,可以包括一個(gè)或一個(gè)以上中央處理器(centralprocessingunits,cpu)1322(例如,一個(gè)或一個(gè)以上處理器)和存儲(chǔ)器1332,一個(gè)或一個(gè)以上存儲(chǔ)應(yīng)用程序1342或數(shù)據(jù)1344的存儲(chǔ)介質(zhì)1330(例如一個(gè)或一個(gè)以上海量存儲(chǔ)設(shè)備)。其中,存儲(chǔ)器1332和存儲(chǔ)介質(zhì)1330可以是短暫存儲(chǔ)或持久存儲(chǔ)。存儲(chǔ)在存儲(chǔ)介質(zhì)1330的程序可以包括一個(gè)或一個(gè)以上模塊(圖示未示出),每個(gè)模塊可以包括對(duì)服務(wù)器中的一系列指令操作。更進(jìn)一步地,中央處理器1322可以設(shè)置為與存儲(chǔ)介質(zhì)1330通信,在服務(wù)器1300上執(zhí)行存儲(chǔ)介質(zhì)1330中的一系列指令操作。服務(wù)器1300還可以包括一個(gè)或一個(gè)以上電源1326,一個(gè)或一個(gè)以上有線或無線網(wǎng)絡(luò)接口1350,一個(gè)或一個(gè)以上輸入輸出接口1358,和/或,一個(gè)或一個(gè)以上操作系統(tǒng)1341,例如windowsservertm,macosxtm,unixtm,linuxtm,freebsdtm等等。
上述圖2對(duì)應(yīng)實(shí)施例中的外部可以是應(yīng)用程序1342,持久化存儲(chǔ)的數(shù)據(jù)和緩存數(shù)據(jù)可以是數(shù)據(jù)1344。數(shù)據(jù)訪問接口程序可以存儲(chǔ)在存儲(chǔ)器1332中,中央處理器1322可以調(diào)用存儲(chǔ)器1332中的數(shù)據(jù)訪問接口程序,該數(shù)據(jù)訪問接口程序可以采用本公開示例性實(shí)施例提供的方法實(shí)現(xiàn)數(shù)據(jù)的緩存。
本領(lǐng)域普通技術(shù)人員可以理解實(shí)現(xiàn)上述實(shí)施例的全部或部分步驟可以通過硬件來完成,也可以通過程序來指令相關(guān)的硬件完成,所述的程序可以存儲(chǔ)于一種計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)中,上述提到的存儲(chǔ)介質(zhì)可以是只讀存儲(chǔ)器,磁盤或光盤等
下述為本公開裝置實(shí)施例,可以用于執(zhí)行本公開上述服務(wù)器1300執(zhí)行的實(shí)現(xiàn)數(shù)據(jù)緩存的方法實(shí)施例。對(duì)于本公開裝置實(shí)施例中未披露的細(xì)節(jié),請(qǐng)參照本公開實(shí)現(xiàn)數(shù)據(jù)緩存的方法實(shí)施例。
圖14是根據(jù)一示例性實(shí)施例示出的一種實(shí)現(xiàn)數(shù)據(jù)緩存的裝置的框圖,該實(shí)現(xiàn)數(shù)據(jù)緩存的裝置可以用于13所示實(shí)施環(huán)境的服務(wù)器1300中,執(zhí)行圖2-12任一所示的實(shí)現(xiàn)數(shù)據(jù)緩存的方法的全部或者部分步驟。該實(shí)現(xiàn)數(shù)據(jù)緩存的裝置可以是數(shù)據(jù)訪問接口,該數(shù)據(jù)訪問接口作為外部實(shí)現(xiàn)持久化存儲(chǔ)的數(shù)據(jù)和緩存數(shù)據(jù)訪問的接口,如圖14所示,該實(shí)現(xiàn)數(shù)據(jù)緩存的裝置包括但不限于:查詢請(qǐng)求接收模塊1410、數(shù)據(jù)查詢模塊1430、數(shù)據(jù)請(qǐng)求模塊1450以及數(shù)據(jù)緩存模塊1470。
其中,請(qǐng)求接收模塊1410,用于接收外部所發(fā)起對(duì)數(shù)據(jù)觸發(fā)的查詢請(qǐng)求;
數(shù)據(jù)查詢模塊1430,用于根據(jù)所述查詢請(qǐng)求在所述緩存數(shù)據(jù)中執(zhí)行數(shù)據(jù)查詢操作,獲得所述數(shù)據(jù)不存在的查詢結(jié)果;
數(shù)據(jù)請(qǐng)求模塊1450,用于根據(jù)所述查詢結(jié)果,按照所述查詢請(qǐng)求對(duì)所述持久化存儲(chǔ)的數(shù)據(jù)執(zhí)行數(shù)據(jù)查詢操作,獲得請(qǐng)求的所述數(shù)據(jù);
數(shù)據(jù)緩存模塊1470,用于對(duì)獲得的所述數(shù)據(jù)進(jìn)行緩存,形成所述數(shù)據(jù)的所述緩存數(shù)據(jù)。
上述裝置中各個(gè)模塊的功能和作用的實(shí)現(xiàn)過程具體詳見上述實(shí)現(xiàn)數(shù)據(jù)緩存的方法的實(shí)施例中對(duì)應(yīng)步驟的實(shí)現(xiàn)過程,在此不再贅述。
請(qǐng)求接收模塊1410比如可以是圖13的某一個(gè)物理結(jié)構(gòu)中央處理器1322。
數(shù)據(jù)查詢模塊1430、數(shù)據(jù)請(qǐng)求模塊1450以及數(shù)據(jù)緩存模塊1470也可以是功能模塊,用于執(zhí)行上述實(shí)現(xiàn)數(shù)據(jù)緩存的方法中的對(duì)應(yīng)步驟。可以理解,這些模塊可以通過硬件、軟件、或二者結(jié)合來實(shí)現(xiàn)。當(dāng)以硬件方式實(shí)現(xiàn)時(shí),這些模塊可以實(shí)施為一個(gè)或多個(gè)硬件模塊,例如一個(gè)或多個(gè)專用集成電路。當(dāng)以軟件方式實(shí)現(xiàn)時(shí),這些模塊可以實(shí)施為在一個(gè)或多個(gè)處理器上執(zhí)行的一個(gè)或多個(gè)計(jì)算機(jī)程序,例如圖13的中央處理器1322所執(zhí)行的存儲(chǔ)在存儲(chǔ)器1332中的程序。
圖15為本公開一示例性實(shí)施例示出的對(duì)圖14對(duì)應(yīng)實(shí)施例中的數(shù)據(jù)請(qǐng)求模塊1450的細(xì)節(jié)進(jìn)行描述的框圖,如圖15所示,該數(shù)據(jù)請(qǐng)求模塊1450包括但不限于:參數(shù)解析單元1451、指令生成單元1452以及數(shù)據(jù)獲取單元1453;
其中,參數(shù)解析單元1451,用于解析接收的所述查詢請(qǐng)求得到數(shù)據(jù)庫查詢參數(shù);
指令生成單元1452,用于根據(jù)解析得到的所述數(shù)據(jù)庫查詢參數(shù)以及指定數(shù)據(jù)庫查詢指令的格式,生成數(shù)據(jù)庫查詢指令;
數(shù)據(jù)獲取單元1453,用于在被數(shù)據(jù)庫持久化存儲(chǔ)的數(shù)據(jù)中執(zhí)行所述數(shù)據(jù)庫查詢指令獲得請(qǐng)求的所述數(shù)據(jù)。
可選的,在上述任一示例性實(shí)施例提供的實(shí)現(xiàn)數(shù)據(jù)緩存的裝置的基礎(chǔ)上,該實(shí)現(xiàn)數(shù)據(jù)緩存的裝置還可以包括但不限于:
修改請(qǐng)求接收模塊,用于接收觸發(fā)進(jìn)行數(shù)據(jù)修改的請(qǐng)求;
數(shù)據(jù)修改模塊,用于根據(jù)所述觸發(fā)進(jìn)行數(shù)據(jù)修改的請(qǐng)求,向所述持久化存儲(chǔ)的數(shù)據(jù)執(zhí)行數(shù)據(jù)修改操作,相應(yīng)對(duì)所述數(shù)據(jù)的緩存數(shù)據(jù)執(zhí)行數(shù)據(jù)刪除操作。
進(jìn)一步的,在該實(shí)現(xiàn)數(shù)據(jù)緩存的裝置還可以包括但不限于:
刪除請(qǐng)求接收模塊,用于接收觸發(fā)進(jìn)行數(shù)據(jù)刪除的請(qǐng)求;
第一數(shù)據(jù)刪除模塊,用于根據(jù)所述觸發(fā)進(jìn)行數(shù)據(jù)刪除的請(qǐng)求,向所述持久化存儲(chǔ)的數(shù)據(jù)執(zhí)行數(shù)據(jù)刪除操作,相應(yīng)對(duì)所述數(shù)據(jù)的緩存數(shù)據(jù)執(zhí)行數(shù)據(jù)刪除操作。
此外,在其他實(shí)施例中,所述實(shí)現(xiàn)數(shù)據(jù)緩存的裝置還可以包括但不限于:
變更通知接收模塊,用于接收進(jìn)行持久化存儲(chǔ)的所述數(shù)據(jù)已發(fā)生變更的通知;
第二數(shù)據(jù)刪除模塊,用于根據(jù)所述通知對(duì)所述數(shù)據(jù)的緩存數(shù)據(jù)執(zhí)行數(shù)據(jù)刪除操作。
可選的,本公開了一種實(shí)現(xiàn)數(shù)據(jù)緩存的裝置,該實(shí)現(xiàn)數(shù)據(jù)緩存的裝置可以用于圖13所示實(shí)施環(huán)境的服務(wù)器,執(zhí)行圖2-12任一所示的實(shí)現(xiàn)數(shù)據(jù)緩存的方法的全部或者部分步驟。所述裝置包括:
處理器;
用于存儲(chǔ)處理器可執(zhí)行指令的存儲(chǔ)器;
其中,所述處理器用于執(zhí)行以下操作:
接收外部所發(fā)起對(duì)數(shù)據(jù)觸發(fā)的查詢請(qǐng)求;
根據(jù)所述查詢請(qǐng)求在所述緩存數(shù)據(jù)中執(zhí)行數(shù)據(jù)查詢操作,獲得所述數(shù)據(jù)不存在的查詢結(jié)果;
根據(jù)所述查詢結(jié)果,按照所述查詢請(qǐng)求對(duì)所述持久化存儲(chǔ)的數(shù)據(jù)執(zhí)行數(shù)據(jù)查詢操作,獲得請(qǐng)求的所述數(shù)據(jù);
對(duì)獲得的所述數(shù)據(jù)進(jìn)行緩存,形成所述數(shù)據(jù)的所述緩存數(shù)據(jù)。
該實(shí)施例中的裝置的處理器執(zhí)行操作的具體方式已經(jīng)在有關(guān)該實(shí)現(xiàn)數(shù)據(jù)緩存的方法的實(shí)施例中執(zhí)行了詳細(xì)描述,此處將不做詳細(xì)闡述說明。
應(yīng)當(dāng)理解的是,本發(fā)明并不局限于上面已經(jīng)描述并在附圖中示出的精確結(jié)構(gòu),并且可以在不脫離其范圍執(zhí)行各種修改和改變。本發(fā)明的范圍僅由所附的權(quán)利要求來限制。