實(shí)現(xiàn)數(shù)據(jù)緩存的方法和裝置的制造方法
【專利摘要】本發(fā)明公開了一種實(shí)現(xiàn)數(shù)據(jù)緩存的方法和裝置。響應(yīng)于針對(duì)指定鍵的數(shù)據(jù)變更指令,變更指定鍵在易失性存儲(chǔ)器上的緩存中對(duì)應(yīng)的緩存值;將表示數(shù)據(jù)變更指令的代碼追加記錄到非易失性存儲(chǔ)器上的日志文件中緊接有效內(nèi)容之后的當(dāng)前記錄位置,并成為有效內(nèi)容的一部分。響應(yīng)于滿足預(yù)定數(shù)據(jù)備份條件,執(zhí)行數(shù)據(jù)備份操作,即將日志文件的有效內(nèi)容中的每一個(gè)鍵在緩存中對(duì)應(yīng)的緩存值與對(duì)應(yīng)的每一個(gè)鍵關(guān)聯(lián)地存儲(chǔ)到非易失性存儲(chǔ)器上的鍵值存儲(chǔ)區(qū);在完成數(shù)據(jù)備份操作之后,使日志文件原來的有效內(nèi)容無效。由此,實(shí)現(xiàn)了一種既具有持久化功能,又可以在重啟時(shí)快速重新構(gòu)建數(shù)據(jù)的鍵值數(shù)據(jù)緩存方案。
【專利說明】
實(shí)現(xiàn)數(shù)據(jù)緩存的方法和裝置
技術(shù)領(lǐng)域
[0001]本發(fā)明涉及一種實(shí)現(xiàn)數(shù)據(jù)緩存的方法和裝置。
【背景技術(shù)】
[0002]目前,在一些例如涉及互聯(lián)網(wǎng)的應(yīng)用中,緩存技術(shù)得到了廣泛的使用。其中比較常見的緩存是memcached和redis,它們都可以提供k_v (key-value,key是鍵,value是值)緩存服務(wù),但是它們各自存在相應(yīng)的缺點(diǎn),在要求提供可靠k-v緩存服務(wù)的場(chǎng)景下往往不能滿足實(shí)際的業(yè)務(wù)需要。
[0003]眾所周知,memcached是沒有持久化功能的。一旦重啟,就會(huì)造成數(shù)據(jù)丟失。應(yīng)用程序需要執(zhí)行額外的業(yè)務(wù)邏輯來重建數(shù)據(jù)。例如,需要從數(shù)據(jù)庫中取出數(shù)據(jù)再存儲(chǔ)到memcached 中。
[0004]redis雖然具有持久化功能,但是在數(shù)據(jù)量大的場(chǎng)景下,持久化功能對(duì)內(nèi)存資源要求高、重啟恢復(fù)慢。另外,還存在丟失數(shù)據(jù)的可能。
[0005]因此,需要設(shè)計(jì)一種新的k-v (鍵值)緩存方案,其既具有持久化功能,又可以在重啟時(shí)快速重新構(gòu)建數(shù)據(jù)。
【發(fā)明內(nèi)容】
[0006]本發(fā)明所要解決的一個(gè)問題是提供一種實(shí)現(xiàn)數(shù)據(jù)緩存的方法和裝置,其既具有持久化功能,又可以在重啟時(shí)快速重新構(gòu)建數(shù)據(jù)。
[0007]根據(jù)本發(fā)明的一個(gè)方面,提供了一種實(shí)現(xiàn)數(shù)據(jù)緩存的方法,包括:
[0008]響應(yīng)于針對(duì)指定鍵的數(shù)據(jù)變更指令,
[0009]變更指定鍵在易失性存儲(chǔ)器上的緩存中對(duì)應(yīng)的緩存值;
[0010]將表示數(shù)據(jù)變更指令的代碼追加記錄到非易失性存儲(chǔ)器上的日志文件中緊接有效內(nèi)容之后的當(dāng)前記錄位置,并成為有效內(nèi)容的一部分;
[0011 ] 響應(yīng)于滿足預(yù)定數(shù)據(jù)備份條件,
[0012]執(zhí)行數(shù)據(jù)備份操作,即將日志文件的有效內(nèi)容中的每一個(gè)鍵在緩存中對(duì)應(yīng)的緩存值與對(duì)應(yīng)的每一個(gè)鍵關(guān)聯(lián)地存儲(chǔ)到非易失性存儲(chǔ)器上的鍵值存儲(chǔ)區(qū);
[0013]在完成數(shù)據(jù)備份操作之后,使日志文件原來的有效內(nèi)容無效。
[0014]根據(jù)本發(fā)明,在完成數(shù)據(jù)備份操作之后,日志文件的有效內(nèi)容被使得無效。這樣,在日志文件的有效內(nèi)容中記錄了自初次啟動(dòng)之后(尚未執(zhí)行過數(shù)據(jù)備份操作的情況下)或上次數(shù)據(jù)備份操作之后執(zhí)行過的所有數(shù)據(jù)變更指令。
[0015]這樣,在執(zhí)行數(shù)據(jù)備份時(shí),只需要將日志文件的有效內(nèi)容中涉及到的鍵和對(duì)應(yīng)的緩存值關(guān)聯(lián)地存儲(chǔ)到鍵值存儲(chǔ)區(qū)中,即可確保當(dāng)前在緩存中的值均已保存在鍵值存儲(chǔ)區(qū)中。
[0016]由于在非易失性存儲(chǔ)器中既存儲(chǔ)了執(zhí)行數(shù)據(jù)備份操作時(shí)緩存中的鍵和值,又存儲(chǔ)了執(zhí)行數(shù)據(jù)備份操作以后執(zhí)行過的數(shù)據(jù)變更指令,所以即使易失性存儲(chǔ)器中的所有數(shù)據(jù)丟失,也可以根據(jù)非易失性存儲(chǔ)器中存儲(chǔ)的內(nèi)容來重建緩存中的數(shù)據(jù)。由此,可靠地實(shí)現(xiàn)了數(shù)據(jù)持久性。
[0017]而在執(zhí)行數(shù)據(jù)重建時(shí),可以針對(duì)各個(gè)鍵,以鍵值存儲(chǔ)區(qū)中與該鍵關(guān)聯(lián)存儲(chǔ)的值為初始值,依次執(zhí)行日志文件的有效內(nèi)容中所記錄的針對(duì)該鍵的數(shù)據(jù)變更指令,即可獲得該鍵先前在緩存中的緩存值。從而可以方便地實(shí)現(xiàn)數(shù)據(jù)重建。
[0018]由于每次執(zhí)行數(shù)據(jù)備份之后,日志文件的有效內(nèi)容都清零并重新開始記錄,因此,日志文件的有效內(nèi)容不會(huì)變得越來越大,重建數(shù)據(jù)時(shí)需要考慮的數(shù)據(jù)變更指令也就不會(huì)太多,從而可以在例如重啟時(shí)快速重建緩存中的數(shù)據(jù)。
[0019]優(yōu)選地,該方法還可以包括:
[0020]響應(yīng)于針對(duì)指定鍵的數(shù)據(jù)變更指令,
[0021]在易失性存儲(chǔ)器中的日志表中維護(hù)指定鍵的指令鏈,以便將數(shù)據(jù)變更指令追加到指令鏈的末尾;
[0022]響應(yīng)于滿足預(yù)定數(shù)據(jù)備份條件,
[0023]在完成數(shù)據(jù)備份操作之后,將日志表清空,
[0024]其中,執(zhí)行數(shù)據(jù)備份操作的步驟是通過將日志表中的每一個(gè)鍵在緩存中對(duì)應(yīng)的緩存值與對(duì)應(yīng)的每一個(gè)鍵關(guān)聯(lián)地存儲(chǔ)到非易失性存儲(chǔ)器上的鍵值存儲(chǔ)區(qū)來執(zhí)行的。
[0025]這樣,在易失性存儲(chǔ)器中維護(hù)一個(gè)日志表,在執(zhí)行數(shù)據(jù)變更指令時(shí),在其中更新指定鍵的指令鏈,在執(zhí)行數(shù)據(jù)備份操作后,將日志表清空,使得日志表中的指令鏈與日志文件中的數(shù)據(jù)變更指令記錄同步。即在日志表中也記錄了自初次啟動(dòng)之后(尚未執(zhí)行過數(shù)據(jù)備份操作的情況下)或上次數(shù)據(jù)備份操作之后執(zhí)行過的所有數(shù)據(jù)變更指令。
[0026]而從易失性存儲(chǔ)器中的日志表中存取數(shù)據(jù)變更指令更加方便快速。并且,由于以指令鏈的形式依次記錄針對(duì)各個(gè)鍵的數(shù)據(jù)變更指令,與日志文件相比,需要獲取對(duì)某個(gè)鍵執(zhí)行過的數(shù)據(jù)變更指令時(shí),更加快捷。
[0027]當(dāng)執(zhí)行數(shù)據(jù)備份操作時(shí),從日志表得知自初次啟動(dòng)之后(尚未執(zhí)行過數(shù)據(jù)備份操作的情況下)或上次數(shù)據(jù)備份操作之后針對(duì)哪些鍵執(zhí)行了數(shù)據(jù)變更指令,以便針對(duì)這些鍵執(zhí)行數(shù)據(jù)備份操作,避免了從日志文件獲知針對(duì)哪些鍵執(zhí)行了數(shù)據(jù)變更指令的繁瑣操作。
[0028]優(yōu)選地,維護(hù)指定鍵的指令鏈的步驟可以包括:
[0029]在數(shù)據(jù)變更指令是操作結(jié)果與初始值無關(guān)的指令的情況下,刪除日志表中指定鍵的原來的指令鏈,并將數(shù)據(jù)變更指令記錄在指定鍵的指令鏈的開頭;和/或
[0030]在日志表中沒有指定鍵的指令鏈的情況下,建立指定鍵的指令鏈,并將數(shù)據(jù)變更指令記錄在指定鍵的指令鏈的開頭。
[0031]操作結(jié)果與初始值無關(guān)的指令例如可以包括設(shè)置指令(set)、刪除指令(delete)等。
[0032]在數(shù)據(jù)變更指令的操作結(jié)果與初始值無關(guān)的指令的情況下,先前的指令對(duì)于計(jì)算重建緩存中的值均已沒有意義和效果。因此,沒有必要再保留。刪除原來的指令鏈,既可以減小日志表的數(shù)據(jù)量,也可以減小后期重建數(shù)據(jù)時(shí)的數(shù)據(jù)變更指令處理量。
[0033]優(yōu)選地,該方法還可以包括:
[0034]響應(yīng)于易失性存儲(chǔ)器中數(shù)據(jù)丟失后的數(shù)據(jù)預(yù)加載指令,
[0035]基于日志文件的有效內(nèi)容重建日志表;
[0036]確定熱點(diǎn)鍵;
[0037]對(duì)于每一個(gè)熱點(diǎn)鍵,
[0038]從鍵值存儲(chǔ)區(qū)獲得與熱點(diǎn)鍵對(duì)應(yīng)的存儲(chǔ)值;
[0039]在日志表中查找熱點(diǎn)鍵;
[0040]在查找到熱點(diǎn)鍵的情況下,對(duì)熱點(diǎn)鍵對(duì)應(yīng)的存儲(chǔ)值依次執(zhí)行日志表中熱點(diǎn)鍵的指令鏈上的每一條指令,以獲得推算值,并將推算值與熱點(diǎn)鍵關(guān)聯(lián)地存儲(chǔ)到緩存中;以及
[0041]在沒有查找到熱點(diǎn)鍵的情況下,將上述存儲(chǔ)值與熱點(diǎn)鍵關(guān)聯(lián)地存儲(chǔ)到緩存中。
[0042]緩存中并不是所有數(shù)據(jù)都是還會(huì)繼續(xù)會(huì)用到的。這樣,在執(zhí)行預(yù)加載操作時(shí),只需先針對(duì)熱點(diǎn)鍵進(jìn)行數(shù)據(jù)重建,即可滿足大部分的需求。并且可以大幅減小數(shù)據(jù)預(yù)加載操作所需的時(shí)間,提高數(shù)據(jù)預(yù)加載操作的效率。
[0043]例如,熱點(diǎn)鍵可以是最后執(zhí)行的預(yù)定數(shù)量的數(shù)據(jù)變更指令所針對(duì)的鍵?;蛘?,也可以是最后被變更過的預(yù)定數(shù)量個(gè)鍵?;蛘?,也可以是被變更次數(shù)最多的預(yù)定數(shù)量個(gè)鍵。
[0044]熱點(diǎn)鍵可以通過對(duì)日志文件的有效內(nèi)容進(jìn)行分析來確定?;蛘?,也可以在鍵值存儲(chǔ)區(qū)中記錄熱點(diǎn)鍵信息,從而可以從鍵值存儲(chǔ)區(qū)確定熱點(diǎn)鍵?;蛘?,也可以在非易失性存儲(chǔ)器上日志文件和鍵值存儲(chǔ)區(qū)之外記錄熱點(diǎn)鍵信息,以便在數(shù)據(jù)預(yù)加載時(shí)使用。
[0045]優(yōu)選地,該方法還可以包括:
[0046]響應(yīng)于從緩存中讀取指定鍵對(duì)應(yīng)的值的指令,
[0047]在緩存中沒有指定鍵的情況下,基于日志表和鍵值存儲(chǔ)區(qū)來獲得指定鍵對(duì)應(yīng)的推算值;以及
[0048]返回推算值,并將推算值與指定鍵關(guān)聯(lián)地存儲(chǔ)到緩存中。
[0049]緩存中沒有指定鍵,說明該指定鍵不是熱點(diǎn)鍵,在數(shù)據(jù)預(yù)加載時(shí)沒有預(yù)加載該指定鍵對(duì)應(yīng)的值。此時(shí)可以根據(jù)日志表和鍵值存儲(chǔ)區(qū)來獲得推算值。這樣,即使是用到非熱點(diǎn)鍵時(shí),也可以快速獲得相應(yīng)的值。
[0050]基于日志表和鍵值存儲(chǔ)區(qū)來獲得指定鍵對(duì)應(yīng)的推算值的步驟可以包括如下幾種情況。
[0051]在日志表中沒有指定鍵的情況下,從鍵值存儲(chǔ)區(qū)獲得指定鍵對(duì)應(yīng)的存儲(chǔ)值,并以存儲(chǔ)值為推算值。這種情況表明,在最后一次數(shù)據(jù)備份操作之后沒有針對(duì)該指定鍵進(jìn)行數(shù)據(jù)變更操作,因此鍵值存儲(chǔ)區(qū)中的存儲(chǔ)值是最新值。
[0052]在日志表中指定鍵的指令鏈的開頭是操作結(jié)果與初始值無關(guān)的指令的情況下,依次執(zhí)行指令鏈上的指令,以得到推算值。這種情況下,無需從鍵值存儲(chǔ)區(qū)讀取存儲(chǔ)值,可以直接根據(jù)指令鏈獲得推算值。
[0053]在日志表中指定鍵的指令鏈的開頭不是操作結(jié)果與初始值無關(guān)的指令的情況下,從鍵值存儲(chǔ)區(qū)獲得指定鍵對(duì)應(yīng)的存儲(chǔ)值,對(duì)存儲(chǔ)值依次執(zhí)行日志表中指定鍵的指令鏈上的每一條指令,以獲得推算值。
[0054]由此,在上述各種情況下,都可以方便快捷地獲得推算值。
[0055]優(yōu)選地,基于日志文件的有效內(nèi)容重建日志表的步驟可以包括:獲取日志文件的有效部分的開始位置和結(jié)束位置。相應(yīng)地,使日志文件原來的有效內(nèi)容無效的步驟可以包括:將日志文件的有效內(nèi)容的開始位置設(shè)置為日志文件的當(dāng)前記錄位置。
[0056]這種使原來的有效內(nèi)容變?yōu)闊o效的方式非常簡(jiǎn)單易用。
[0057]優(yōu)選地,日志文件可以包括具有預(yù)定次序的多個(gè)預(yù)先定義的日志子文件,每個(gè)日志子文件具有固定文件尺寸,當(dāng)預(yù)定次序中的最后一個(gè)日志子文件被寫滿時(shí),將當(dāng)前記錄位置調(diào)整到預(yù)定次序中的第一個(gè)日志子文件的開頭。
[0058]通過循環(huán)地覆蓋式記錄,避免了日志文件無限制地?cái)U(kuò)大。
[0059]優(yōu)選地,預(yù)定數(shù)據(jù)備份條件可以包括以下條件中的一項(xiàng)或多項(xiàng):到達(dá)預(yù)定時(shí)刻;自上一次執(zhí)行數(shù)據(jù)備份操作以來經(jīng)過了預(yù)定時(shí)間段;當(dāng)前記錄位置到達(dá)日志文件的預(yù)定位置;日志文件的有效內(nèi)容達(dá)到預(yù)定數(shù)量個(gè)日志文件;以及接收到數(shù)據(jù)備份指令。
[0060]這樣,可以根據(jù)需要設(shè)定各種數(shù)據(jù)備份條件。
[0061]根據(jù)本發(fā)明的另一個(gè)方面,提供了一種實(shí)現(xiàn)數(shù)據(jù)緩存的裝置,包括:緩存值變更裝置,用于響應(yīng)于針對(duì)指定鍵的數(shù)據(jù)變更指令,變更指定鍵在易失性存儲(chǔ)器上的緩存中對(duì)應(yīng)的緩存值;日志記錄裝置,用于響應(yīng)于針對(duì)指定鍵的數(shù)據(jù)變更指令,將表示數(shù)據(jù)變更指令的代碼追加記錄到非易失性存儲(chǔ)器上的日志文件中緊接有效內(nèi)容之后的當(dāng)前記錄位置,并成為有效內(nèi)容的一部分;數(shù)據(jù)備份裝置,用于響應(yīng)于滿足預(yù)定數(shù)據(jù)備份條件,執(zhí)行數(shù)據(jù)備份操作,即將日志文件的有效內(nèi)容中的每一個(gè)鍵在緩存中對(duì)應(yīng)的緩存值與對(duì)應(yīng)的每一個(gè)鍵關(guān)聯(lián)地存儲(chǔ)到非易失性存儲(chǔ)器上的鍵值存儲(chǔ)區(qū);以及有效內(nèi)容管理裝置,用于在數(shù)據(jù)備份裝置完成數(shù)據(jù)備份操作之后,使日志文件原來的有效內(nèi)容無效。
[0062]由此,可以方便可靠地實(shí)現(xiàn)數(shù)據(jù)變更和數(shù)據(jù)備份。
[0063]優(yōu)選地,該裝置還可以包括:日志表維護(hù)裝置,用于響應(yīng)于針對(duì)指定鍵的數(shù)據(jù)變更指令,在易失性存儲(chǔ)器中的日志表中維護(hù)指定鍵的指令鏈,以便將數(shù)據(jù)變更指令追加到指令鏈的末尾;日志表清空裝置,用于在數(shù)據(jù)備份裝置完成數(shù)據(jù)備份操作之后,將日志表清空,其中,數(shù)據(jù)備份裝置通過將日志表中的每一個(gè)鍵在緩存中對(duì)應(yīng)的緩存值與對(duì)應(yīng)的每一個(gè)鍵關(guān)聯(lián)地存儲(chǔ)到非易失性存儲(chǔ)器上的鍵值存儲(chǔ)區(qū),來執(zhí)行數(shù)據(jù)備份操作。
[0064]由此,通過使用日志表,可以使得數(shù)據(jù)備份操作更加快捷。
[0065]優(yōu)選地,日志表維護(hù)裝置可以包括:第一維護(hù)裝置,用于在數(shù)據(jù)變更指令是操作結(jié)果與初始值無關(guān)的指令的情況下,刪除日志表中指定鍵的原來的指令鏈,并將數(shù)據(jù)變更指令記錄在指定鍵的指令鏈的開頭;和/或第二維護(hù)裝置,用于在日志表中沒有指定鍵的指令鏈的情況下,建立指定鍵的指令鏈,并將數(shù)據(jù)變更指令記錄在指定鍵的指令鏈的開頭。
[0066]由此,既可以減小日志表的數(shù)據(jù)量,也可以減小后期重建數(shù)據(jù)時(shí)的數(shù)據(jù)變更指令處理量。
[0067]優(yōu)選地,該裝置還可以包括:日志表重建裝置,用于響應(yīng)于易失性存儲(chǔ)器中數(shù)據(jù)丟失后的數(shù)據(jù)預(yù)加載指令,基于日志文件的有效內(nèi)容重建日志表;熱點(diǎn)鍵確定裝置,用于響應(yīng)于數(shù)據(jù)預(yù)加載指令,確定熱點(diǎn)鍵;存儲(chǔ)值獲取裝置,用于對(duì)于每一個(gè)熱點(diǎn)鍵,從鍵值存儲(chǔ)區(qū)獲得與熱點(diǎn)鍵對(duì)應(yīng)的存儲(chǔ)值;熱點(diǎn)鍵查找裝置,用于對(duì)于每一個(gè)熱點(diǎn)鍵,在日志表中查找熱點(diǎn)鍵;第一緩存裝置,用于在查找到熱點(diǎn)鍵的情況下,對(duì)熱點(diǎn)鍵對(duì)應(yīng)的存儲(chǔ)值依次執(zhí)行日志表中熱點(diǎn)鍵的指令鏈上的每一條指令,以獲得推算值,并將推算值與熱點(diǎn)鍵關(guān)聯(lián)地存儲(chǔ)到緩存中;以及第二緩存裝置,用于在沒有查找到熱點(diǎn)鍵的情況下,將上述存儲(chǔ)值與熱點(diǎn)鍵關(guān)聯(lián)地存儲(chǔ)到緩存中。
[0068]由此,可以快捷地實(shí)現(xiàn)數(shù)據(jù)預(yù)加載。
[0069]優(yōu)選地,該裝置還可以包括:推算值獲取裝置,用于響應(yīng)于從緩存中讀取指定鍵對(duì)應(yīng)的值的指令,在緩存中沒有指定鍵的情況下,基于日志表和鍵值存儲(chǔ)區(qū)來獲得指定鍵對(duì)應(yīng)的推算值;以及推算值返回裝置,用于返回推算值,并將推算值與指定鍵關(guān)聯(lián)地存儲(chǔ)到緩存中。
[0070]由此,可以實(shí)現(xiàn)數(shù)據(jù)讀取。
[0071]優(yōu)選地,推算值獲取裝置可以包括:第一獲取裝置,用于在日志表中沒有指定鍵的情況下,從鍵值存儲(chǔ)區(qū)獲得指定鍵對(duì)應(yīng)的存儲(chǔ)值,并以存儲(chǔ)值為推算值;和/或第二獲取裝置,用于在日志表中指定鍵的指令鏈的開頭是操作結(jié)果與初始值無關(guān)的指令的情況下,依次執(zhí)行指令鏈上的指令,以得到推算值;和/或第三獲取裝置,用于在日志表中指定鍵的指令鏈的開頭不是操作結(jié)果與初始值無關(guān)的指令的情況下,從鍵值存儲(chǔ)區(qū)獲得指定鍵對(duì)應(yīng)的存儲(chǔ)值,對(duì)存儲(chǔ)值依次執(zhí)行日志表中指定鍵的指令鏈上的每一條指令,以獲得推算值。
[0072]由此,可以方便快捷地獲得推算值。
[0073]優(yōu)選地,日志表重建裝置可以包括:有效部分確定裝置,用于獲取日志文件的有效部分的開始位置和結(jié)束位置。相應(yīng)地,有效內(nèi)容管理裝置可以包括:開始位置設(shè)置裝置,用于將日志文件的有效內(nèi)容的開始位置設(shè)置為日志文件的當(dāng)前記錄位置,從而使日志文件原來的有效內(nèi)容無效。
[0074]由此,可以方便地實(shí)現(xiàn)使日志文件原來的有效內(nèi)容無效的目的。
[0075]優(yōu)選地,日志文件包括具有預(yù)定次序的多個(gè)預(yù)先定義的日志子文件,每個(gè)日志子文件具有固定文件尺寸。日志記錄裝置可以包括:當(dāng)前記錄位置調(diào)整裝置,用于在預(yù)定次序中的最后一個(gè)日志子文件被寫滿時(shí),將當(dāng)前記錄位置調(diào)整到預(yù)定次序中的第一個(gè)日志子文件的開頭。
[0076]如上所述,根據(jù)本發(fā)明的實(shí)現(xiàn)數(shù)據(jù)緩存的方法和裝置既具有持久化功能,又可以在重啟時(shí)快速重新構(gòu)建數(shù)據(jù)。
【附圖說明】
[0077]通過結(jié)合附圖對(duì)本公開示例性實(shí)施方式進(jìn)行更詳細(xì)的描述,本公開的上述以及其它目的、特征和優(yōu)勢(shì)將變得更加明顯,其中,在本公開示例性實(shí)施方式中,相同的參考標(biāo)號(hào)通常代表相同部件。
[0078]圖1是根據(jù)本發(fā)明實(shí)施例的數(shù)據(jù)變更過程的示意性流程圖。
[0079]圖2是根據(jù)本發(fā)明實(shí)施例的數(shù)據(jù)備份過程的示意性流程圖。
[0080]圖3是根據(jù)本發(fā)明改進(jìn)實(shí)施例的數(shù)據(jù)變更過程的示意性流程圖。
[0081]圖4是日志表中針對(duì)各個(gè)鍵維護(hù)的指令鏈的示意圖。
[0082]圖5是維護(hù)指令鏈的方法的示意性流程圖。
[0083]圖6是根據(jù)本發(fā)明改進(jìn)實(shí)施例的數(shù)據(jù)備份過程的示意性流程圖。
[0084]圖7是根據(jù)本發(fā)明實(shí)施例的數(shù)據(jù)預(yù)加載過程的示意性流程圖。
[0085]圖8是根據(jù)本發(fā)明實(shí)施例的數(shù)據(jù)讀取過程的示意性流程圖。
[0086]圖9是獲得推算值的方法的示意性流程圖。
[0087]圖10是根據(jù)本發(fā)明實(shí)施例的數(shù)據(jù)緩存裝置的示意性框圖,其中示出了用于執(zhí)行數(shù)據(jù)變更過程和數(shù)據(jù)備份過程的部分。
[0088]圖11是根據(jù)本發(fā)明改進(jìn)實(shí)施例的數(shù)據(jù)緩存裝置的示意性框圖,其中示出了用于執(zhí)行數(shù)據(jù)變更過程和數(shù)據(jù)備份過程的部分。
[0089]圖12是日志表維護(hù)裝置的示意性框圖。
[0090]圖13是根據(jù)本發(fā)明實(shí)施例的數(shù)據(jù)緩存裝置的示意性框圖,其中示出了用于執(zhí)行數(shù)據(jù)預(yù)加載過程的部分。
[0091]圖14是根據(jù)本發(fā)明實(shí)施例的數(shù)據(jù)緩存裝置的示意性框圖,其中示出了用于執(zhí)行數(shù)據(jù)讀取過程的部分。
[0092]圖15是推算值獲取裝置的示意性框圖。
【具體實(shí)施方式】
[0093]下面將參照附圖更詳細(xì)地描述本公開的優(yōu)選實(shí)施方式。雖然附圖中顯示了本公開的優(yōu)選實(shí)施方式,然而應(yīng)該理解,可以以各種形式實(shí)現(xiàn)本公開而不應(yīng)被這里闡述的實(shí)施方式所限制。相反,提供這些實(shí)施方式是為了使本公開更加透徹和完整,并且能夠?qū)⒈竟_的范圍完整地傳達(dá)給本領(lǐng)域的技術(shù)人員。
[0094]根據(jù)本發(fā)明的實(shí)現(xiàn)數(shù)據(jù)緩存的方法主要可以包括兩個(gè)方面,即對(duì)各個(gè)鍵在易失性存儲(chǔ)器中的對(duì)應(yīng)緩存值的數(shù)據(jù)變更過程和從易失性存儲(chǔ)器到非易失性存儲(chǔ)器的數(shù)據(jù)備份過程。
[0095]易失性存儲(chǔ)器,例如內(nèi)存或只讀存儲(chǔ)器(R0M),處理速度快,但是不具有持久性,一但斷電或重啟,其中的數(shù)據(jù)就會(huì)丟失。
[0096]非易失性存儲(chǔ)器,例如磁盤等,具有持久性,數(shù)據(jù)不易丟失,但是處理速度往往不如易失性存儲(chǔ)器快。
[0097]圖1是根據(jù)本發(fā)明實(shí)施例的數(shù)據(jù)變更過程的示意性流程圖。
[0098]當(dāng)要執(zhí)行數(shù)據(jù)變更過程時(shí),會(huì)收到數(shù)據(jù)變更指令,即對(duì)某個(gè)指定鍵對(duì)應(yīng)的值進(jìn)行某種預(yù)定運(yùn)算/操作/處理,從而得到新的值。
[0099]數(shù)據(jù)變更指令例如可以有設(shè)置指令(set)、刪除指令(delete)、加一指令(incr)、減一指令(deer)、比較并交換指令(cas)等。
[0100]如圖1所示,響應(yīng)于針對(duì)指定鍵的數(shù)據(jù)變更指令,可以執(zhí)行步驟SllO和步驟S120。步驟SllO和步驟S120可以以任何順序執(zhí)行,也可以并行執(zhí)行。
[0101]在步驟S110,變更指定鍵在易失性存儲(chǔ)器上的緩存中對(duì)應(yīng)的緩存值。
[0102]在步驟S120,將表示數(shù)據(jù)變更指令的代碼追加記錄到非易失性存儲(chǔ)器上的日志文件中緊接有效內(nèi)容之后的當(dāng)前記錄位置,并成為有效內(nèi)容的一部分。
[0103]日志文件例如可以是二進(jìn)制日志文件(binlog文件),數(shù)據(jù)變更指令可以在序列化成代碼之后,以追加的方式寫入日志文件。
[0104]與在非易失性存儲(chǔ)器中同步更新鍵值的方案相比,追加記錄指令代碼的方式簡(jiǎn)單快捷,耗費(fèi)的資源也較少。
[0105]但是,如果一直這樣持續(xù)下去,日志文件的有效內(nèi)容會(huì)越來越長(zhǎng)。一方面會(huì)占用較大的存儲(chǔ)空間。另一方面,在后期進(jìn)行數(shù)據(jù)重建時(shí),需要對(duì)很長(zhǎng)的日志文件有效內(nèi)容進(jìn)行分析,耗費(fèi)較多的時(shí)間和資源。
[0106]通過圖2所示的數(shù)據(jù)備份操作,可以克服上述問題。
[0107]圖2是根據(jù)本發(fā)明實(shí)施例的數(shù)據(jù)備份過程的示意性流程圖。
[0108]可以預(yù)先設(shè)定數(shù)據(jù)備份條件。例如,預(yù)定數(shù)據(jù)備份條件可以包括以下條件中的一項(xiàng)或多項(xiàng):
[0109]到達(dá)預(yù)定時(shí)刻;
[0110]自上一次執(zhí)行備份操作以來經(jīng)過了預(yù)定時(shí)間段;
[0111]當(dāng)前記錄位置到達(dá)日志文件的預(yù)定位置;
[0112]日志文件的有效內(nèi)容達(dá)到預(yù)定數(shù)量個(gè)日志文件;以及
[0113]接收到數(shù)據(jù)備份指令。
[0114]這樣,可以根據(jù)需要設(shè)定各種數(shù)據(jù)備份條件。
[0115]如圖2所示,在步驟S210,響應(yīng)于滿足預(yù)定數(shù)據(jù)備份條件,執(zhí)行數(shù)據(jù)備份操作,即將日志文件的有效內(nèi)容中的每一個(gè)鍵在緩存中對(duì)應(yīng)的緩存值與對(duì)應(yīng)的每一個(gè)鍵關(guān)聯(lián)地存儲(chǔ)到非易失性存儲(chǔ)器上的鍵值存儲(chǔ)區(qū)。
[0116]例如,可以采用日志型的IevelDb數(shù)據(jù)庫系統(tǒng)來作為存儲(chǔ)引擎,來執(zhí)行數(shù)據(jù)備份操作。
[0117]在執(zhí)行數(shù)據(jù)備份操作之前(上次執(zhí)行數(shù)據(jù)備份操作之后),可能針對(duì)一些鍵的對(duì)應(yīng)緩存值執(zhí)行了多次數(shù)據(jù)變更操作。通過只在滿足預(yù)定數(shù)據(jù)備份條件時(shí)才執(zhí)行數(shù)據(jù)備份操作,只需要對(duì)最后一次的操作結(jié)果進(jìn)行備份,減少了在非易失性存儲(chǔ)器中更新鍵值的次數(shù),從而減少了所耗費(fèi)的資源。
[0118]在步驟S220,在完成步驟S210的數(shù)據(jù)備份操作之后,使日志文件原來的有效內(nèi)容無效。
[0119]另外,日志文件的有效內(nèi)容可以具有開始位置和結(jié)束位置。結(jié)束位置一般與當(dāng)前記錄位置相接。在步驟S220,可以通過將日志文件的有效內(nèi)容的開始位置設(shè)置為日志文件的當(dāng)前記錄位置,來實(shí)現(xiàn)日志文件原來的有效內(nèi)容無效的目的。這種使原來的有效內(nèi)容變?yōu)闊o效的方式非常簡(jiǎn)單易用。
[0120]根據(jù)本發(fā)明,在完成數(shù)據(jù)備份操作之后,日志文件的有效內(nèi)容被使得無效。這樣,在日志文件的有效內(nèi)容中記錄了自初次啟動(dòng)之后(尚未執(zhí)行過數(shù)據(jù)備份操作的情況下)或上次數(shù)據(jù)備份操作之后執(zhí)行過的所有數(shù)據(jù)變更指令。
[0121]這樣,在執(zhí)行數(shù)據(jù)備份時(shí),只需要將日志文件的有效內(nèi)容中涉及到的鍵和對(duì)應(yīng)的緩存值關(guān)聯(lián)地存儲(chǔ)到鍵值存儲(chǔ)區(qū)中,即可確保當(dāng)前在緩存中的值均已保存在鍵值存儲(chǔ)區(qū)中。
[0122]由于在非易失性存儲(chǔ)器中既存儲(chǔ)了執(zhí)行數(shù)據(jù)備份操作時(shí)緩存中的鍵和值,又存儲(chǔ)了執(zhí)行數(shù)據(jù)備份操作以后執(zhí)行過的數(shù)據(jù)變更指令,所以即使易失性存儲(chǔ)器中的所有數(shù)據(jù)丟失,也可以根據(jù)非易失性存儲(chǔ)器中存儲(chǔ)的內(nèi)容來重建緩存中的數(shù)據(jù)。由此,可靠地實(shí)現(xiàn)了數(shù)據(jù)持久性。
[0123]而在執(zhí)行數(shù)據(jù)重建時(shí),可以針對(duì)各個(gè)鍵,以鍵值存儲(chǔ)區(qū)中與該鍵關(guān)聯(lián)存儲(chǔ)的值為初始值,依次執(zhí)行日志文件的有效內(nèi)容中所記錄的針對(duì)該鍵的數(shù)據(jù)變更指令,即可獲得該鍵先前在緩存中的緩存值。從而可以方便地實(shí)現(xiàn)數(shù)據(jù)重建。
[0124]由于每次執(zhí)行數(shù)據(jù)備份之后,日志文件的有效內(nèi)容都清零并重新開始記錄,因此,日志文件的有效內(nèi)容不會(huì)變得越來越大,重建數(shù)據(jù)時(shí)需要考慮的數(shù)據(jù)變更指令也就不會(huì)太多,從而可以在例如重啟時(shí)快速重建緩存中的數(shù)據(jù)。
[0125]另外,日志文件可以包括具有預(yù)定次序的多個(gè)預(yù)先定義的日志子文件,每個(gè)日志子文件具有固定文件尺寸。當(dāng)預(yù)定次序中的最后一個(gè)日志子文件被寫滿時(shí),將當(dāng)前記錄位置調(diào)整到預(yù)定次序中的第一個(gè)日志子文件的開頭。通過循環(huán)地覆蓋式記錄,避免了日志文件無限制地?cái)U(kuò)大。只是上述預(yù)定備份條件需要設(shè)置為使得,在日志文件中先前記錄的內(nèi)容被覆蓋之前已對(duì)其執(zhí)行了數(shù)據(jù)備份操作。
[0126]日志文件中的數(shù)據(jù)是按順序依次寫入的,當(dāng)重建某個(gè)鍵對(duì)應(yīng)的緩存值時(shí),需要得到在日志文件的有效部分中涉及這個(gè)鍵的全部有效指令,即需要隨機(jī)訪問日志文件。
[0127]為了更加便于執(zhí)行備份操作,在根據(jù)本發(fā)明的改進(jìn)實(shí)施例中,可以進(jìn)一步在易失性存儲(chǔ)器中維護(hù)日志表(例如可以是哈希(hash)表),其中針對(duì)上次備份操作之后緩存中的對(duì)應(yīng)緩存值被變更過的鍵,分別維護(hù)一個(gè)指令鏈。
[0128]圖3是根據(jù)本發(fā)明改進(jìn)實(shí)施例的數(shù)據(jù)變更過程的示意性流程圖。
[0129]如圖3所示,響應(yīng)于針對(duì)指定鍵的數(shù)據(jù)變更指令,響應(yīng)于針對(duì)指定鍵的數(shù)據(jù)變更指令,除了如圖1所示一樣執(zhí)行上述步驟SllO和步驟S120之外,還可以進(jìn)一步執(zhí)行步驟S130。步驟S110、步驟S120以及步驟S130可以以任何順序執(zhí)行,也可以并行執(zhí)行。
[0130]在步驟S130,在易失性存儲(chǔ)器中的日志表中維護(hù)指定鍵的指令鏈,以便將數(shù)據(jù)變更指令追加到指令鏈的末尾。
[0131 ] 圖4是日志表中針對(duì)各個(gè)鍵維護(hù)的指令鏈的示意圖。
[0132]如圖4所示,針對(duì)鍵I和鍵2,分別依次記錄了其所涉及的指令1、指令2、……、指令 n/m0
[0133]圖5是一種可以用來維護(hù)指令鏈的方法的示意性流程圖。
[0134]如圖5所示,響應(yīng)于針對(duì)指定鍵的數(shù)據(jù)變更指令,可以如下維護(hù)指定鍵的指令鏈。
[0135]在步驟S131,判斷日志表中有沒有指定鍵的指令鏈。
[0136]在日志表中沒有指定鍵的指令鏈的情況下,在步驟S132,在日志表中建立指定鍵的指令鏈,并將數(shù)據(jù)變更指令記錄在指定鍵的指令鏈的開頭。
[0137]在日志表中有指定鍵的指令鏈的情況下,在步驟S133,判斷數(shù)據(jù)變更指令是否操作結(jié)果與初始值無關(guān)的指令。
[0138]操作結(jié)果與初始值無關(guān)的指令例如可以包括設(shè)置指令(set)、刪除指令(delete)等。
[0139]在數(shù)據(jù)變更指令不是操作結(jié)果與初始值無關(guān)的指令的情況下,在步驟S134,將數(shù)據(jù)變更指令追加到針對(duì)指定鍵的指令鏈的末尾。
[0140]而在數(shù)據(jù)變更指令不是操作結(jié)果與初始值無關(guān)的指令的情況下,在步驟S135,刪除日志表中指定鍵的原來的指令鏈,并在步驟S136,將數(shù)據(jù)變更指令記錄在指定鍵的指令鏈的開頭。
[0141]例如,鍵I (keyl)當(dāng)前的指令鏈為“set->incr->incr_>decr”,當(dāng)接收到delete指令時(shí),鍵I的指令鏈可以變?yōu)?“delete”,而不必是“set->incr->incr->decr->delete”。
[0142]在數(shù)據(jù)變更指令的操作結(jié)果與初始值無關(guān)的指令的情況下,先前的指令對(duì)于計(jì)算重建緩存中的值均已沒有意義和效果。因此,沒有必要再保留。刪除原來的指令鏈,既可以減小日志表的數(shù)據(jù)量,也可以減小后期重建數(shù)據(jù)時(shí)的數(shù)據(jù)變更指令處理量。
[0143]圖6是根據(jù)本發(fā)明改進(jìn)實(shí)施例的數(shù)據(jù)備份過程的示意性流程圖。
[0144]如圖6所示,在如圖2所示響應(yīng)于滿足預(yù)定數(shù)據(jù)備份條件而在步驟S210執(zhí)行數(shù)據(jù)備份操作之后,除了可以執(zhí)行上述步驟S220,還可以執(zhí)行步驟S230 ο步驟S220和步驟S1230可以以任何順序執(zhí)行,也可以并行執(zhí)行。
[0145]在步驟S230,將日志表清空。
[0146]由于在易失性存儲(chǔ)器中以更加便于存取的方式存儲(chǔ)了日志文件中的指令代碼,在步驟S210,可以根據(jù)易失性存儲(chǔ)器中的日志表而不是非易失性存儲(chǔ)器中的日志文件來執(zhí)行數(shù)據(jù)備份操作。即,通過將日志表中的每一個(gè)鍵在緩存中對(duì)應(yīng)的緩存值與對(duì)應(yīng)的每一個(gè)鍵關(guān)聯(lián)地存儲(chǔ)到非易失性存儲(chǔ)器上的鍵值存儲(chǔ)區(qū)來執(zhí)行數(shù)據(jù)備份操作。
[0147]這樣,在易失性存儲(chǔ)器中維護(hù)一個(gè)日志表,在執(zhí)行數(shù)據(jù)變更指令時(shí),在其中更新指定鍵的指令鏈,在執(zhí)行數(shù)據(jù)備份操作后,將日志表清空,使得日志表中的指令鏈與日志文件中的數(shù)據(jù)變更指令記錄同步。即在日志表中也記錄了自初次啟動(dòng)之后(尚未執(zhí)行過數(shù)據(jù)備份操作的情況下)或上次數(shù)據(jù)備份操作之后執(zhí)行過的所有數(shù)據(jù)變更指令。
[0148]而從易失性存儲(chǔ)器中的日志表中存取數(shù)據(jù)變更指令更加方便快速。并且,由于以指令鏈的形式依次記錄針對(duì)各個(gè)鍵的數(shù)據(jù)變更指令,與日志文件相比,需要獲取對(duì)某個(gè)鍵執(zhí)行過的數(shù)據(jù)變更指令時(shí),更加快捷。
[0149]當(dāng)執(zhí)行數(shù)據(jù)備份操作時(shí),從日志表得知自初次啟動(dòng)之后(尚未執(zhí)行過數(shù)據(jù)備份操作的情況下)或上次數(shù)據(jù)備份操作之后針對(duì)哪些鍵執(zhí)行了數(shù)據(jù)變更指令,以便針對(duì)這些鍵執(zhí)行數(shù)據(jù)備份操作,避免了從日志文件獲知針對(duì)哪些鍵執(zhí)行了數(shù)據(jù)變更指令的繁瑣操作。
[0150]在由于斷電或重啟而導(dǎo)致易失性存儲(chǔ)器中的數(shù)據(jù)丟失的情況下,可以進(jìn)行數(shù)據(jù)預(yù)加載,即根據(jù)非易失性存儲(chǔ)器上的鍵值存儲(chǔ)區(qū)中存儲(chǔ)的數(shù)據(jù)和日志文件的有效內(nèi)容中記錄的指令來恢復(fù)緩存中的數(shù)據(jù)。
[0151]例如在如上所述使用IevelDb作為存儲(chǔ)引擎的情況下,LevelDb的讀操作性能不如寫操作性能,因此,希望能夠減少讀操作的次數(shù)和復(fù)雜性。
[0152]—方面,可以建立索引以便快速定位到目標(biāo)鍵對(duì)應(yīng)的存儲(chǔ)值所在的塊,然后再從該塊中讀取出該存儲(chǔ)值。
[0153]另一方面,如上所述,如果指令鏈的鏈?zhǔn)?開頭)是操作結(jié)果與初始值無關(guān)的指令,可以避免從鍵值存儲(chǔ)區(qū)讀取數(shù)據(jù)的操作。
[0154]再一方面,可以只預(yù)加載部分熱點(diǎn)數(shù)據(jù)到緩存中。例如,可以根據(jù)非易失性存儲(chǔ)器上的鍵值存儲(chǔ)區(qū)中的數(shù)據(jù)量,來指定一部分或者全部數(shù)據(jù)都加載到緩存。
[0155]下面參考圖7描述根據(jù)本發(fā)明實(shí)施例的數(shù)據(jù)預(yù)加載過程,其中只預(yù)加載了熱點(diǎn)鍵對(duì)應(yīng)的存儲(chǔ)值。
[0156]圖7是根據(jù)本發(fā)明實(shí)施例的數(shù)據(jù)預(yù)加載過程的示意性流程圖。
[0157]響應(yīng)于易失性存儲(chǔ)器中數(shù)據(jù)丟失后的數(shù)據(jù)預(yù)加載指令,在步驟S710,基于日志文件的有效內(nèi)容重建日志表。
[0158]如上所述,日志文件的有效內(nèi)容中記錄了自初次啟動(dòng)之后(尚未執(zhí)行過數(shù)據(jù)備份操作的情況下)或上次數(shù)據(jù)備份操作之后執(zhí)行過的所有數(shù)據(jù)變更指令。這樣,就可以根據(jù)日志文件的有效內(nèi)容中記錄的指令,為其中涉及的鍵(針對(duì)其對(duì)應(yīng)的值執(zhí)行過數(shù)據(jù)變更指令的鍵),建立指令鏈,從而可以在易失性存儲(chǔ)器中恢復(fù)日志表。
[0159]在步驟S710,基于日志文件的有效內(nèi)容重建日志表時(shí),可以首先通過獲取日志文件的有效部分的開始位置和結(jié)束位置來確定日志文件的有效內(nèi)容。
[0160]接下來,在步驟S720,確定熱點(diǎn)鍵。
[0161]例如,熱點(diǎn)鍵可以是最后執(zhí)行的預(yù)定數(shù)量的數(shù)據(jù)變更指令所針對(duì)的鍵?;蛘?,也可以是最后被變更過的預(yù)定數(shù)量個(gè)鍵?;蛘?,也可以是被變更次數(shù)最多的預(yù)定數(shù)量個(gè)鍵。
[0162]由于日志文件中按順序記錄了所執(zhí)行過的數(shù)據(jù)變更指令,所以可以通過對(duì)日志文件的有效內(nèi)容進(jìn)行分析來確定熱點(diǎn)鍵。
[0163]或者,也可以在鍵值存儲(chǔ)區(qū)中記錄熱點(diǎn)鍵信息,從而可以從鍵值存儲(chǔ)區(qū)確定熱點(diǎn)鍵。
[0164]或者,也可以在非易失性存儲(chǔ)器上日志文件和鍵值存儲(chǔ)區(qū)之外記錄熱點(diǎn)鍵信息,以便在數(shù)據(jù)預(yù)加載時(shí)使用。
[0165]接下來,在步驟S730,從第一個(gè)熱點(diǎn)鍵開始,對(duì)每一個(gè)熱點(diǎn)鍵執(zhí)行步驟S740至步驟S770/S780的操作。
[0166]在步驟S740,從鍵值存儲(chǔ)區(qū)獲得與該熱點(diǎn)鍵對(duì)應(yīng)的存儲(chǔ)值。
[0167]在步驟S750,在日志表中查找熱點(diǎn)鍵。
[0168]在步驟S760,判斷是否在日志表中查找到熱點(diǎn)鍵。
[0169]在日志表中查找到該熱點(diǎn)鍵的情況下,在步驟S770,對(duì)熱點(diǎn)鍵對(duì)應(yīng)的存儲(chǔ)值依次執(zhí)行日志表中熱點(diǎn)鍵的指令鏈上的每一條指令,以獲得推算值,并將推算值與熱點(diǎn)鍵關(guān)聯(lián)地存儲(chǔ)到緩存中。
[0170]在日志表中沒有查找到該熱點(diǎn)鍵的情況下,在步驟S780,將上述存儲(chǔ)值與熱點(diǎn)鍵關(guān)聯(lián)地存儲(chǔ)到緩存中。
[0171]然后在步驟S790判斷是否還有下一個(gè)熱點(diǎn)鍵,如果有,則針對(duì)下一個(gè)熱點(diǎn)鍵執(zhí)行步驟S740至步驟S770/S780的操作。
[0172]如果沒有下一個(gè)熱點(diǎn)鍵了,則預(yù)加載操作結(jié)束。
[0173]緩存中并不是所有數(shù)據(jù)都是還會(huì)繼續(xù)會(huì)用到的。這樣,在執(zhí)行預(yù)加載操作時(shí),只需先針對(duì)熱點(diǎn)鍵進(jìn)行數(shù)據(jù)重建,即可滿足大部分的需求。并且可以大幅減小數(shù)據(jù)預(yù)加載操作所需的時(shí)間,提高數(shù)據(jù)預(yù)加載操作的效率。
[0174]需要注意的是,如果在上面參考圖7描述的預(yù)加載過程中,不執(zhí)行步驟S720,并且在步驟S730至步驟S790中,不只是對(duì)熱點(diǎn)鍵執(zhí)行相應(yīng)操作,而是對(duì)日志表或日志文件中涉及的所有鍵執(zhí)行相應(yīng)操作,則可以實(shí)現(xiàn)完全的預(yù)加載,即完全恢復(fù)緩存中原有的數(shù)據(jù)。
[0175]下面,參考圖8描述在已經(jīng)執(zhí)行了預(yù)加載操作之后,在運(yùn)行過程中,執(zhí)行從緩存讀取數(shù)據(jù)的數(shù)據(jù)讀取過程。
[0176]圖8是根據(jù)本發(fā)明實(shí)施例的數(shù)據(jù)讀取過程的示意性流程圖。
[0177]如圖8所述,響應(yīng)于從緩存中讀取指定鍵對(duì)應(yīng)的值的指令,在步驟S810,查看在緩存中有沒有該指定鍵(或該指定鍵對(duì)應(yīng)的緩存值)。
[0178]如果有,說明沒有發(fā)生過(至少針對(duì)該緩存值的)數(shù)據(jù)丟失,或者數(shù)據(jù)丟失后已經(jīng)通過例如預(yù)加載操作或先前的數(shù)據(jù)讀取操作而加載了該緩存值。這種情況下,在步驟S820,直接從緩存中讀取對(duì)應(yīng)的緩存值,并返回該緩存值即可。
[0179]在緩存中沒有該指定鍵(或該指定鍵對(duì)應(yīng)的緩存值)的情況下,在步驟S830,可以基于日志表和鍵值存儲(chǔ)區(qū)來獲得指定鍵對(duì)應(yīng)的推算值。然后,在步驟S840,返回推算值。進(jìn)一步地,可以將推算值與指定鍵關(guān)聯(lián)地存儲(chǔ)到緩存中,以便于以后使用。
[0180]緩存中沒有指定鍵,說明該指定鍵不是熱點(diǎn)鍵,在數(shù)據(jù)預(yù)加載時(shí)沒有預(yù)加載該指定鍵對(duì)應(yīng)的值。此時(shí)可以根據(jù)日志表和鍵值存儲(chǔ)區(qū)來獲得推算值。這樣,即使是用到非熱點(diǎn)鍵時(shí),也可以快速獲得相應(yīng)的值。
[0181]下面參考圖9進(jìn)一步描述步驟730中基于日志表和鍵值存儲(chǔ)區(qū)來獲得指定鍵對(duì)應(yīng)的推算值的操作可能涉及的幾種情況。
[0182]圖9是獲得推算值的方法的示意性流程圖。
[0183]在步驟S810中判定緩存中沒有指定鍵的情況下,在步驟S831,查看日志表中沒有該指定鍵。
[0184]在日志表中也沒有該指定鍵的情況下,表明在最后一次數(shù)據(jù)備份操作之后沒有針對(duì)該指定鍵進(jìn)行數(shù)據(jù)變更操作,因此鍵值存儲(chǔ)區(qū)中的存儲(chǔ)值是最新值。于是,在步驟S832,從鍵值存儲(chǔ)區(qū)獲得指定鍵對(duì)應(yīng)的存儲(chǔ)值,并以存儲(chǔ)值為推算值,然后,操作前進(jìn)到步驟S840。
[0185]在日志表中有該指定鍵的情況下,在步驟S833,判斷日志表中該指定鍵的指令鏈的開頭(鏈?zhǔn)?是否是操作結(jié)果與初始值無關(guān)的指令。如上所述,操作結(jié)果與初始值無關(guān)的指令例如可以包括設(shè)置指令(set)、刪除指令(delete)等。
[0186]在日志表中指定鍵的指令鏈的開頭是操作結(jié)果與初始值無關(guān)的指令的情況下,在步驟S834,依次執(zhí)行指令鏈上的指令,以得到推算值,然后,操作前進(jìn)到步驟S840。這種情況下,無需從鍵值存儲(chǔ)區(qū)讀取存儲(chǔ)值,可以直接根據(jù)指令鏈獲得推算值。當(dāng)使用例如IevelDb存儲(chǔ)引擎來對(duì)鍵值存儲(chǔ)區(qū)進(jìn)行存取時(shí),可以減少讀操作。
[0187]在日志表中指定鍵的指令鏈的開頭不是操作結(jié)果與初始值無關(guān)的指令的情況下,在步驟S835,從鍵值存儲(chǔ)區(qū)獲得指定鍵對(duì)應(yīng)的存儲(chǔ)值,對(duì)存儲(chǔ)值依次執(zhí)行日志表中指定鍵的指令鏈上的每一條指令,以獲得推算值,然后,操作前進(jìn)到步驟S840。
[0188]由此,在上述各種情況下,都可以方便快捷地獲得推算值。
[0189]以上參考圖1至9詳細(xì)描述了根據(jù)本發(fā)明實(shí)現(xiàn)數(shù)據(jù)緩存的方法。下面參考圖10至15詳細(xì)描述根據(jù)本發(fā)明實(shí)現(xiàn)數(shù)據(jù)緩存的裝置。
[0190]根據(jù)本發(fā)明實(shí)現(xiàn)數(shù)據(jù)緩存的裝置(數(shù)據(jù)緩存裝置)的各個(gè)子裝置的功能與上面描述的方法的各個(gè)步驟分別大致對(duì)應(yīng)。為了節(jié)省篇幅,對(duì)其中一些細(xì)節(jié),在此不再贅述。
[0191]圖10是根據(jù)本發(fā)明實(shí)施例的數(shù)據(jù)緩存裝置300的示意性框圖,其中示出了用于執(zhí)行數(shù)據(jù)變更過程和數(shù)據(jù)備份過程的部分。
[0192]如圖10所示,針對(duì)數(shù)據(jù)變更過程和數(shù)據(jù)備份過程,數(shù)據(jù)緩存裝置300可以包括緩存值變更裝置310、日志記錄裝置320、數(shù)據(jù)備份裝置330、有效內(nèi)容管理裝置340。
[0193]緩存值變更裝置310用于響應(yīng)于針對(duì)指定鍵的數(shù)據(jù)變更指令,變更指定鍵在易失性存儲(chǔ)器100上的緩存120中對(duì)應(yīng)的緩存值。
[0194]日志記錄裝置320用于響應(yīng)于針對(duì)指定鍵的數(shù)據(jù)變更指令,將表示數(shù)據(jù)變更指令的代碼追加記錄到非易失性存儲(chǔ)器200上的日志文件220中緊接有效內(nèi)容之后的當(dāng)前記錄位置,并成為有效內(nèi)容的一部分。
[0195]數(shù)據(jù)備份裝置330用于響應(yīng)于滿足預(yù)定數(shù)據(jù)備份條件,執(zhí)行數(shù)據(jù)備份操作,即將日志文件220的有效內(nèi)容中的每一個(gè)鍵在緩存120中對(duì)應(yīng)的緩存值與對(duì)應(yīng)的每一個(gè)鍵關(guān)聯(lián)地存儲(chǔ)到非易失性存儲(chǔ)器200上的鍵值存儲(chǔ)區(qū)240。
[0196]有效內(nèi)容管理裝置340用于在數(shù)據(jù)備份裝置330完成數(shù)據(jù)備份操作之后,使日志文件220原來的有效內(nèi)容無效。
[0197]日志文件220可以包括具有預(yù)定次序的多個(gè)預(yù)先定義的日志子文件,每個(gè)日志子文件具有固定文件尺寸。日志記錄裝置可以包括:當(dāng)前記錄位置調(diào)整裝置用于在預(yù)定次序中的最后一個(gè)日志子文件被寫滿時(shí),將當(dāng)前記錄位置調(diào)整到預(yù)定次序中的第一個(gè)日志子文件的開頭。
[0198]日志文件220的有效內(nèi)容可以具有開始位置和結(jié)束位置。有效內(nèi)容管理裝置340可以包括開始位置設(shè)置裝置(未示出)。開始位置設(shè)置裝置用于將日志文件220的有效內(nèi)容的開始位置設(shè)置為日志文件220的當(dāng)前記錄位置,從而使日志文件220原來的有效內(nèi)容無效。
[0199]圖11是根據(jù)本發(fā)明改進(jìn)實(shí)施例的數(shù)據(jù)緩存裝置300的示意性框圖,其中示出了用于執(zhí)行數(shù)據(jù)變更過程和數(shù)據(jù)備份過程的部分。
[0200]如圖11所示,針對(duì)數(shù)據(jù)變更過程和數(shù)據(jù)備份過程,數(shù)據(jù)緩存裝置300除了可以包括緩存值變更裝置310、日志記錄裝置320、數(shù)據(jù)備份裝置330、有效內(nèi)容管理裝置340,還可以進(jìn)一步包括日志表維護(hù)裝置350和日志表清空裝置360。
[0201]日志表維護(hù)裝置350用于響應(yīng)于針對(duì)指定鍵的數(shù)據(jù)變更指令,在易失性存儲(chǔ)器100中的日志表140中維護(hù)指定鍵的指令鏈,以便將數(shù)據(jù)變更指令追加到指令鏈的末尾。
[0202]日志表清空裝置360用于在數(shù)據(jù)備份裝置330完成數(shù)據(jù)備份操作之后,將日志表140清空。
[0203]其中,數(shù)據(jù)備份裝置330通過將日志表140中的每一個(gè)鍵在緩存120中對(duì)應(yīng)的緩存120值與對(duì)應(yīng)的每一個(gè)鍵關(guān)聯(lián)地存儲(chǔ)到非易失性存儲(chǔ)器200上的鍵值存儲(chǔ)區(qū)240,來執(zhí)行數(shù)據(jù)備份操作。
[0204]圖12是日志表維護(hù)裝置350的示意性框圖。
[0205]如圖12所示,日志表維護(hù)裝置350可以包括:第一維護(hù)裝置352和/或第二維護(hù)裝置354。
[0206]第一維護(hù)裝置352用于在數(shù)據(jù)變更指令是操作結(jié)果與初始值無關(guān)的指令的情況下,刪除日志表140中指定鍵的原來的指令鏈,并將數(shù)據(jù)變更指令記錄在指定鍵的指令鏈的開頭。
[0207]第二維護(hù)裝置354用于在日志表140中沒有指定鍵的指令鏈的情況下,建立指定鍵的指令鏈,并將數(shù)據(jù)變更指令記錄在指定鍵的指令鏈的開頭。
[0208]圖13是根據(jù)本發(fā)明實(shí)施例的數(shù)據(jù)緩存裝置300的示意性框圖,其中示出了用于執(zhí)行數(shù)據(jù)預(yù)加載過程的部分。
[0209]如圖13所示,針對(duì)數(shù)據(jù)預(yù)加載過程,數(shù)據(jù)緩存裝置300可以包括日志表重建裝置371、熱點(diǎn)鍵確定裝置372、熱點(diǎn)鍵查找裝置373、存儲(chǔ)值獲取裝置374、第一緩存裝置375以及第二緩存裝置376。
[0210]日志表重建裝置371用于響應(yīng)于易失性存儲(chǔ)器100中數(shù)據(jù)丟失后的數(shù)據(jù)預(yù)加載指令,基于日志文件220的有效內(nèi)容重建日志表140。
[0211]作為一個(gè)示例,日志表重建裝置371可以包括有效部分確定裝置(未示出)。有效部分確定裝置用于獲取日志文件220的有效部分的開始位置和結(jié)束位置。
[0212]熱點(diǎn)鍵確定裝置372用于響應(yīng)于數(shù)據(jù)預(yù)加載指令,確定熱點(diǎn)鍵。
[0213]存儲(chǔ)值獲取裝置374用于對(duì)于每一個(gè)熱點(diǎn)鍵,從鍵值存儲(chǔ)區(qū)240獲得與熱點(diǎn)鍵對(duì)應(yīng)的存儲(chǔ)值。
[0214]熱點(diǎn)鍵查找裝置373用于對(duì)于每一個(gè)熱點(diǎn)鍵,在日志表140中查找熱點(diǎn)鍵。
[0215]第一緩存裝置375用于在查找到熱點(diǎn)鍵的情況下,對(duì)熱點(diǎn)鍵對(duì)應(yīng)的存儲(chǔ)值依次執(zhí)行日志表140中熱點(diǎn)鍵的指令鏈上的每一條指令,以獲得推算值,并將推算值與熱點(diǎn)鍵關(guān)聯(lián)地存儲(chǔ)到緩存120中。
[0216]第二緩存裝置376用于在沒有查找到熱點(diǎn)鍵的情況下,將上述存儲(chǔ)值與熱點(diǎn)鍵關(guān)聯(lián)地存儲(chǔ)到緩存120中。
[0217]圖14是根據(jù)本發(fā)明實(shí)施例的數(shù)據(jù)緩存裝置300的示意性框圖,其中示出了用于執(zhí)行數(shù)據(jù)讀取過程的部分。
[0218]如圖14所示,針對(duì)數(shù)據(jù)讀取過程,數(shù)據(jù)緩存裝置300可以包括推算值獲取裝置381和推算值返回裝置382。
[0219]推算值獲取裝置381用于響應(yīng)于從緩存120中讀取指定鍵對(duì)應(yīng)的值的指令,在緩存120中沒有指定鍵的情況下,基于日志表140和鍵值存儲(chǔ)區(qū)240來獲得指定鍵對(duì)應(yīng)的推算值。
[0220]推算值返回裝置382用于返回推算值,并將推算值與指定鍵關(guān)聯(lián)地存儲(chǔ)到緩存120 中。
[0221]圖15是推算值獲取裝置381的示意性框圖。
[0222]如圖15所示,推算值獲取裝置可以包括:第一獲取裝置381-1、第二獲取裝置381-2和/或第三獲取裝置381-3。
[0223]第一獲取裝置381-1用于在日志表140中沒有指定鍵的情況下,從鍵值存儲(chǔ)區(qū)240獲得指定鍵對(duì)應(yīng)的存儲(chǔ)值,并以存儲(chǔ)值為推算值。
[0224]第二獲取裝置381-2用于在日志表140中指定鍵的指令鏈的開頭是操作結(jié)果與初始值無關(guān)的指令的情況下,依次執(zhí)行指令鏈上的指令,以得到推算值。
[0225]第三獲取裝置381-3用于在日志表140中指定鍵的指令鏈的開頭不是操作結(jié)果與初始值無關(guān)的指令的情況下,從鍵值存儲(chǔ)區(qū)240獲得指定鍵對(duì)應(yīng)的存儲(chǔ)值,對(duì)存儲(chǔ)值依次執(zhí)行日志表140中指定鍵的指令鏈上的每一條指令,以獲得推算值。
[0226]上文中已經(jīng)參考附圖詳細(xì)描述了根據(jù)本發(fā)明的實(shí)現(xiàn)數(shù)據(jù)緩存的方法和裝置。
[0227]此外,根據(jù)本發(fā)明的方法還可以實(shí)現(xiàn)為一種計(jì)算機(jī)程序產(chǎn)品,該計(jì)算機(jī)程序產(chǎn)品包括計(jì)算機(jī)可讀介質(zhì),在該計(jì)算機(jī)可讀介質(zhì)上存儲(chǔ)有用于執(zhí)行本發(fā)明的方法中限定的上述功能的計(jì)算機(jī)程序。本領(lǐng)域技術(shù)人員還將明白的是,結(jié)合這里的公開所描述的各種示例性邏輯塊、模塊、電路和算法步驟可以被實(shí)現(xiàn)為電子硬件、計(jì)算機(jī)軟件或兩者的組合。
[0228]附圖中的流程圖和框圖顯示了根據(jù)本發(fā)明的多個(gè)實(shí)施例的系統(tǒng)和方法的可能實(shí)現(xiàn)的體系架構(gòu)、功能和操作。在這點(diǎn)上,流程圖或框圖中的每個(gè)方框可以代表一個(gè)模塊、程序段或代碼的一部分,所述模塊、程序段或代碼的一部分包含一個(gè)或多個(gè)用于實(shí)現(xiàn)規(guī)定的邏輯功能的可執(zhí)行指令。也應(yīng)當(dāng)注意,在有些作為替換的實(shí)現(xiàn)中,方框中所標(biāo)記的功能也可以以不同于附圖中所標(biāo)記的順序發(fā)生。例如,兩個(gè)連續(xù)的方框?qū)嶋H上可以基本并行地執(zhí)行,它們有時(shí)也可以按相反的順序執(zhí)行,這依所涉及的功能而定。也要注意的是,框圖和/或流程圖中的每個(gè)方框、以及框圖和/或流程圖中的方框的組合,可以用執(zhí)行規(guī)定的功能或操作的專用的基于硬件的系統(tǒng)來實(shí)現(xiàn),或者可以用專用硬件與計(jì)算機(jī)指令的組合來實(shí)現(xiàn)。
[0229]以上已經(jīng)描述了本發(fā)明的各實(shí)施例,上述說明是示例性的,并非窮盡性的,并且也不限于所披露的各實(shí)施例。在不偏離所說明的各實(shí)施例的范圍和精神的情況下,對(duì)于本技術(shù)領(lǐng)域的普通技術(shù)人員來說許多修改和變更都是顯而易見的。本文中所用術(shù)語的選擇,旨在最好地解釋各實(shí)施例的原理、實(shí)際應(yīng)用或?qū)κ袌?chǎng)中的技術(shù)的改進(jìn),或者使本技術(shù)領(lǐng)域的其它普通技術(shù)人員能理解本文披露的各實(shí)施例。
【主權(quán)項(xiàng)】
1.一種實(shí)現(xiàn)數(shù)據(jù)緩存的方法,包括: 響應(yīng)于針對(duì)指定鍵的數(shù)據(jù)變更指令, 變更所述指定鍵在易失性存儲(chǔ)器上的緩存中對(duì)應(yīng)的緩存值; 將表示所述數(shù)據(jù)變更指令的代碼追加記錄到非易失性存儲(chǔ)器上的日志文件中緊接有效內(nèi)容之后的當(dāng)前記錄位置,并成為所述有效內(nèi)容的一部分; 響應(yīng)于滿足預(yù)定數(shù)據(jù)備份條件, 執(zhí)行數(shù)據(jù)備份操作,即將所述日志文件的有效內(nèi)容中的每一個(gè)鍵在所述緩存中對(duì)應(yīng)的緩存值與所述每一個(gè)鍵關(guān)聯(lián)地存儲(chǔ)到非易失性存儲(chǔ)器上的鍵值存儲(chǔ)區(qū); 在完成所述數(shù)據(jù)備份操作之后,使所述日志文件原來的有效內(nèi)容無效。2.根據(jù)權(quán)利要求1所述的方法,還包括: 響應(yīng)于所述針對(duì)指定鍵的數(shù)據(jù)變更指令, 在所述易失性存儲(chǔ)器中的日志表中維護(hù)所述指定鍵的指令鏈,以便將所述數(shù)據(jù)變更指令追加到所述指令鏈的末尾; 響應(yīng)于滿足所述預(yù)定數(shù)據(jù)備份條件, 在完成所述數(shù)據(jù)備份操作之后,將所述日志表清空, 其中,所述執(zhí)行數(shù)據(jù)備份操作的步驟是通過將所述日志表中的每一個(gè)鍵在所述緩存中對(duì)應(yīng)的緩存值與所述每一個(gè)鍵關(guān)聯(lián)地存儲(chǔ)到所述非易失性存儲(chǔ)器上的鍵值存儲(chǔ)區(qū)來執(zhí)行的。3.根據(jù)權(quán)利要求2所述的方法,其中,所述維護(hù)指定鍵的指令鏈的步驟包括: 在所述數(shù)據(jù)變更指令是操作結(jié)果與初始值無關(guān)的指令的情況下,刪除所述日志表中所述指定鍵的原來的指令鏈,并將所述數(shù)據(jù)變更指令記錄在所述指定鍵的指令鏈的開頭;和/或 在所述日志表中沒有所述指定鍵的指令鏈的情況下,建立所述指定鍵的指令鏈,并將所述數(shù)據(jù)變更指令記錄在所述指定鍵的指令鏈的開頭。4.根據(jù)權(quán)利要求2所述的方法,還包括: 響應(yīng)于所述易失性存儲(chǔ)器中數(shù)據(jù)丟失后的數(shù)據(jù)預(yù)加載指令, 基于所述日志文件的有效內(nèi)容重建所述日志表; 確定熱點(diǎn)鍵; 對(duì)于每一個(gè)所述熱點(diǎn)鍵, 從所述鍵值存儲(chǔ)區(qū)獲得與所述熱點(diǎn)鍵對(duì)應(yīng)的存儲(chǔ)值; 在所述日志表中查找所述熱點(diǎn)鍵; 在查找到所述熱點(diǎn)鍵的情況下,對(duì)所述熱點(diǎn)鍵對(duì)應(yīng)的存儲(chǔ)值依次執(zhí)行所述日志表中所述熱點(diǎn)鍵的指令鏈上的每一條指令,以獲得推算值,并將所述推算值與所述熱點(diǎn)鍵關(guān)聯(lián)地存儲(chǔ)到所述緩存中;以及 在沒有查找到所述熱點(diǎn)鍵的情況下,將所述存儲(chǔ)值與所述熱點(diǎn)鍵關(guān)聯(lián)地存儲(chǔ)到所述緩存中。5.根據(jù)權(quán)利要求4所述的方法,還包括: 響應(yīng)于從所述緩存中讀取指定鍵對(duì)應(yīng)的值的指令, 在所述緩存中沒有所述指定鍵的情況下,基于所述日志表和所述鍵值存儲(chǔ)區(qū)來獲得所述指定鍵對(duì)應(yīng)的推算值;以及 返回所述推算值,并將所述推算值與所述指定鍵關(guān)聯(lián)地存儲(chǔ)到所述緩存中。6.根據(jù)權(quán)利要求5所述的方法,其中,所述基于日志表和鍵值存儲(chǔ)區(qū)來獲得所述指定鍵對(duì)應(yīng)的推算值的步驟包括: 在所述日志表中沒有所述指定鍵的情況下,從所述鍵值存儲(chǔ)區(qū)獲得所述指定鍵對(duì)應(yīng)的存儲(chǔ)值,并以所述存儲(chǔ)值為所述推算值;和/或 在所述日志表中所述指定鍵的指令鏈的開頭是操作結(jié)果與初始值無關(guān)的指令的情況下,依次執(zhí)行所述指令鏈上的指令,以得到所述推算值;和/或 在所述日志表中所述指定鍵的指令鏈的開頭不是操作結(jié)果與初始值無關(guān)的指令的情況下,從所述鍵值存儲(chǔ)區(qū)獲得所述指定鍵對(duì)應(yīng)的存儲(chǔ)值,對(duì)所述存儲(chǔ)值依次執(zhí)行所述日志表中所述指定鍵的指令鏈上的每一條指令,以獲得所述推算值。7.根據(jù)權(quán)利要求4所述的方法,其中, 所述基于日志文件的有效內(nèi)容重建所述日志表的步驟包括:獲取日志文件的有效部分的開始位置和結(jié)束位置, 所述使日志文件原來的有效內(nèi)容無效的步驟包括:將所述日志文件的有效內(nèi)容的開始位置設(shè)置為所述日志文件的當(dāng)前記錄位置。8.根據(jù)權(quán)利要求1所述的方法,其中, 所述日志文件包括具有預(yù)定次序的多個(gè)預(yù)先定義的日志子文件,每個(gè)日志子文件具有固定文件尺寸, 當(dāng)所述預(yù)定次序中的最后一個(gè)日志子文件被寫滿時(shí),將所述當(dāng)前記錄位置調(diào)整到所述預(yù)定次序中的第一個(gè)日志子文件的開頭。9.根據(jù)權(quán)利要求8所述的方法,其中,所述預(yù)定數(shù)據(jù)備份條件包括以下條件中的一項(xiàng)或多項(xiàng): 到達(dá)預(yù)定時(shí)刻; 自上一次執(zhí)行數(shù)據(jù)備份操作以來經(jīng)過了預(yù)定時(shí)間段; 所述當(dāng)前記錄位置到達(dá)所述日志文件的預(yù)定位置; 所述日志文件的有效內(nèi)容達(dá)到預(yù)定數(shù)量個(gè)日志文件;以及 接收到數(shù)據(jù)備份指令。10.一種實(shí)現(xiàn)數(shù)據(jù)緩存的裝置,包括: 緩存值變更裝置,用于響應(yīng)于針對(duì)指定鍵的數(shù)據(jù)變更指令,變更所述指定鍵在易失性存儲(chǔ)器上的緩存中對(duì)應(yīng)的緩存值; 日志記錄裝置,用于響應(yīng)于所述針對(duì)指定鍵的數(shù)據(jù)變更指令,將表示所述數(shù)據(jù)變更指令的代碼追加記錄到非易失性存儲(chǔ)器上的日志文件中緊接有效內(nèi)容之后的當(dāng)前記錄位置,并成為所述有效內(nèi)容的一部分; 數(shù)據(jù)備份裝置,用于響應(yīng)于滿足預(yù)定數(shù)據(jù)備份條件,執(zhí)行數(shù)據(jù)備份操作,即將所述日志文件的有效內(nèi)容中的每一個(gè)鍵在所述緩存中對(duì)應(yīng)的緩存值與所述每一個(gè)鍵關(guān)聯(lián)地存儲(chǔ)到非易失性存儲(chǔ)器上的鍵值存儲(chǔ)區(qū);以及 有效內(nèi)容管理裝置,用于在所述數(shù)據(jù)備份裝置完成所述數(shù)據(jù)備份操作之后,使所述日志文件原來的有效內(nèi)容無效。11.根據(jù)權(quán)利要求10所述的裝置,還包括: 日志表維護(hù)裝置,用于響應(yīng)于所述針對(duì)指定鍵的數(shù)據(jù)變更指令,在所述易失性存儲(chǔ)器中的日志表中維護(hù)所述指定鍵的指令鏈,以便將所述數(shù)據(jù)變更指令追加到所述指令鏈的末尾; 日志表清空裝置,用于在所述數(shù)據(jù)備份裝置完成所述數(shù)據(jù)備份操作之后,將所述日志表清空, 其中,所述數(shù)據(jù)備份裝置通過將所述日志表中的每一個(gè)鍵在所述緩存中對(duì)應(yīng)的緩存值與所述每一個(gè)鍵關(guān)聯(lián)地存儲(chǔ)到所述非易失性存儲(chǔ)器上的鍵值存儲(chǔ)區(qū),來執(zhí)行所述數(shù)據(jù)備份操作。12.根據(jù)權(quán)利要求11所述的裝置,其中,所述日志表維護(hù)裝置包括: 第一維護(hù)裝置,用于在所述數(shù)據(jù)變更指令是操作結(jié)果與初始值無關(guān)的指令的情況下,刪除所述日志表中所述指定鍵的原來的指令鏈,并將所述數(shù)據(jù)變更指令記錄在所述指定鍵的指令鏈的開頭;和/或 第二維護(hù)裝置,用于在所述日志表中沒有所述指定鍵的指令鏈的情況下,建立所述指定鍵的指令鏈,并將所述數(shù)據(jù)變更指令記錄在所述指定鍵的指令鏈的開頭。13.根據(jù)權(quán)利要求11所述的裝置,還包括: 日志表重建裝置,用于響應(yīng)于所述易失性存儲(chǔ)器中數(shù)據(jù)丟失后的數(shù)據(jù)預(yù)加載指令,基于所述日志文件的有效內(nèi)容重建所述日志表; 熱點(diǎn)鍵確定裝置,用于響應(yīng)于所述數(shù)據(jù)預(yù)加載指令,確定熱點(diǎn)鍵; 存儲(chǔ)值獲取裝置,用于對(duì)于每一個(gè)所述熱點(diǎn)鍵,從所述鍵值存儲(chǔ)區(qū)獲得與所述熱點(diǎn)鍵對(duì)應(yīng)的存儲(chǔ)值; 熱點(diǎn)鍵查找裝置,用于對(duì)于每一個(gè)所述熱點(diǎn)鍵,在所述日志表中查找所述熱點(diǎn)鍵;第一緩存裝置,用于在查找到所述熱點(diǎn)鍵的情況下,對(duì)所述熱點(diǎn)鍵對(duì)應(yīng)的存儲(chǔ)值依次執(zhí)行所述日志表中所述熱點(diǎn)鍵的指令鏈上的每一條指令,以獲得推算值,并將所述推算值與所述熱點(diǎn)鍵關(guān)聯(lián)地存儲(chǔ)到所述緩存中;以及 第二緩存裝置,用于在沒有查找到所述熱點(diǎn)鍵的情況下,將所述存儲(chǔ)值與所述熱點(diǎn)鍵關(guān)聯(lián)地存儲(chǔ)到所述緩存中。14.根據(jù)權(quán)利要求13所述的裝置,還包括: 推算值獲取裝置,用于響應(yīng)于從所述緩存中讀取指定鍵對(duì)應(yīng)的值的指令,在所述緩存中沒有所述指定鍵的情況下,基于所述日志表和所述鍵值存儲(chǔ)區(qū)來獲得所述指定鍵對(duì)應(yīng)的推算值;以及 推算值返回裝置,用于返回所述推算值,并將所述推算值與所述指定鍵關(guān)聯(lián)地存儲(chǔ)到所述緩存中。15.根據(jù)權(quán)利要求14所述的裝置,其中,所述推算值獲取裝置包括: 第一獲取裝置,用于在所述日志表中沒有所述指定鍵的情況下,從所述鍵值存儲(chǔ)區(qū)獲得所述指定鍵對(duì)應(yīng)的存儲(chǔ)值,并以所述存儲(chǔ)值為所述推算值;和/或 第二獲取裝置,用于在所述日志表中所述指定鍵的指令鏈的開頭是操作結(jié)果與初始值無關(guān)的指令的情況下,依次執(zhí)行所述指令鏈上的指令,以得到所述推算值;和/或 第三獲取裝置,用于在所述日志表中所述指定鍵的指令鏈的開頭不是操作結(jié)果與初始值無關(guān)的指令的情況下,從所述鍵值存儲(chǔ)區(qū)獲得所述指定鍵對(duì)應(yīng)的存儲(chǔ)值,對(duì)所述存儲(chǔ)值依次執(zhí)行所述日志表中所述指定鍵的指令鏈上的每一條指令,以獲得所述推算值。16.根據(jù)權(quán)利要求13所述的裝置,其中, 所述日志表重建裝置包括:有效部分確定裝置,用于獲取日志文件的有效部分的開始位置和結(jié)束位置, 所述有效內(nèi)容管理裝置包括:開始位置設(shè)置裝置,用于將所述日志文件的有效內(nèi)容的開始位置設(shè)置為所述日志文件的當(dāng)前記錄位置,從而使所述日志文件原來的有效內(nèi)容無效。17.根據(jù)權(quán)利要求10所述的裝置,其中, 所述日志文件包括具有預(yù)定次序的多個(gè)預(yù)先定義的日志子文件,每個(gè)日志子文件具有固定文件尺寸, 所述日志記錄裝置包括:當(dāng)前記錄位置調(diào)整裝置,用于在所述預(yù)定次序中的最后一個(gè)日志子文件被寫滿時(shí),將所述當(dāng)前記錄位置調(diào)整到所述預(yù)定次序中的第一個(gè)日志子文件的開頭。
【文檔編號(hào)】G06F11/34GK105988899SQ201510099063
【公開日】2016年10月5日
【申請(qǐng)日】2015年3月5日
【發(fā)明人】梁捷, 吳堅(jiān)
【申請(qǐng)人】廣州市動(dòng)景計(jì)算機(jī)科技有限公司