本發(fā)明涉及計(jì)算機(jī)技術(shù)領(lǐng)域,具體涉及一種緩存數(shù)據(jù)的方法和裝置。
背景技術(shù):
隨著互聯(lián)網(wǎng)的蓬勃發(fā)展,在很多應(yīng)用場(chǎng)景都需要存儲(chǔ)海量的數(shù)據(jù)。在從數(shù)據(jù)庫(kù)讀取數(shù)據(jù)時(shí),由于數(shù)據(jù)庫(kù)和訪問量都過于龐大,會(huì)導(dǎo)致訪問數(shù)據(jù)的時(shí)間延遲,影響讀取數(shù)據(jù)的速度。通常情況下,會(huì)把訪問頻率較高的熱數(shù)據(jù)放入緩存中,在接收到訪問熱數(shù)據(jù)的請(qǐng)求時(shí)直接從緩存中進(jìn)行讀取,大大增加了讀取速度。
但是,緩存中的數(shù)據(jù)都存在一個(gè)失效時(shí)間,一旦超過失效時(shí)間,該數(shù)據(jù)就會(huì)自動(dòng)從緩存中刪除,刪除后的數(shù)據(jù)再次被訪問時(shí)需要從數(shù)據(jù)庫(kù)中重新讀取數(shù)據(jù),因此對(duì)于一些熱數(shù)據(jù)來說,其訪問速度會(huì)下降,這就嚴(yán)重影響訪問數(shù)據(jù)的速度,降低用戶體驗(yàn)。
技術(shù)實(shí)現(xiàn)要素:
鑒于上述問題,提出了本發(fā)明以便提供一種克服上述問題或者至少部分地解決上述問題的緩存數(shù)據(jù)的方法和裝置。
依據(jù)本發(fā)明的一個(gè)方面,提供了一種緩存數(shù)據(jù)的方法,包括:
對(duì)于一條數(shù)據(jù),在緩存中設(shè)置與該數(shù)據(jù)對(duì)應(yīng)的兩個(gè)鍵-值對(duì);其中,用第一鍵-值對(duì)存放該數(shù)據(jù)本身,設(shè)置其在緩存中的有效時(shí)間為第一預(yù)設(shè)時(shí)間;用第二鍵-值對(duì)標(biāo)記該數(shù)據(jù)的預(yù)失效時(shí)間,設(shè)置其在緩存中的有效時(shí)間為第二預(yù)設(shè)時(shí)間;第二預(yù)設(shè)時(shí)間小于第一預(yù)設(shè)時(shí)間;
當(dāng)收到一數(shù)據(jù)請(qǐng)求時(shí),根據(jù)該數(shù)據(jù)請(qǐng)求在所述緩存中查找與請(qǐng)求的數(shù)據(jù)對(duì)應(yīng)的兩個(gè)鍵-值對(duì);如果從緩存查找到第一鍵-值對(duì),但未查找到第二鍵-值對(duì),則將第一鍵-值對(duì)中的值返回給請(qǐng)求方,從數(shù)據(jù)庫(kù)重新讀取該請(qǐng)求的數(shù)據(jù)來更新緩存中對(duì)應(yīng)的第一鍵-值對(duì)中的值,并重新設(shè)置對(duì)應(yīng)的第二鍵-值對(duì)以及對(duì)應(yīng)的第一預(yù)設(shè)時(shí)間和第二預(yù)設(shè)時(shí)間。
可選地,保存在所述緩存中的數(shù)據(jù)為熱數(shù)據(jù),所述熱數(shù)據(jù)為數(shù)據(jù)庫(kù)中的被訪問頻率高于預(yù)設(shè)值的數(shù)據(jù)。
可選地,該方法進(jìn)一步包括:
如果從緩存中查找到第一鍵-值對(duì),也查找到第二鍵-值對(duì),則將第一鍵-值對(duì)中的值返回給請(qǐng)求方,不作其他處理。
可選地,該方法進(jìn)一步包括:
如果從緩存未查找到第一鍵-值對(duì),則從數(shù)據(jù)庫(kù)中獲取該數(shù)據(jù)請(qǐng)求所請(qǐng)求的數(shù)據(jù)返回給請(qǐng)求方。
可選地,所述用第一鍵-值對(duì)存放該數(shù)據(jù)本身,用第二鍵-值對(duì)標(biāo)記該數(shù)據(jù)的預(yù)失效時(shí)間包括:
將第一鍵-值對(duì)中的值設(shè)置為該條數(shù)據(jù)本身;
將第二鍵-值對(duì)中的值設(shè)置為固定值或任意值。
可選地,將所述第一預(yù)設(shè)時(shí)間對(duì)應(yīng)的時(shí)間值和第二預(yù)設(shè)時(shí)間對(duì)應(yīng)的時(shí)間值保存到指定位置;
每次設(shè)置或重置一條數(shù)據(jù)的第一預(yù)設(shè)時(shí)間和第二預(yù)設(shè)時(shí)間,從所述指定位置讀取對(duì)應(yīng)的時(shí)間值并進(jìn)行設(shè)置或重置。
可選地,該方法進(jìn)一步包括:
根據(jù)數(shù)據(jù)的訪問頻率以及緩存的大小,調(diào)整第一預(yù)設(shè)時(shí)間對(duì)應(yīng)的時(shí)間值和第二預(yù)設(shè)時(shí)間對(duì)應(yīng)的時(shí)間值。
根據(jù)本發(fā)明的另一方面,提供了一種緩存數(shù)據(jù)的裝置,其中,該裝置包括:
緩存處理單元,適于對(duì)于一條數(shù)據(jù),在緩存中設(shè)置與該數(shù)據(jù)對(duì)應(yīng)的兩個(gè)鍵-值對(duì);其中,用第一鍵-值對(duì)存放該數(shù)據(jù)本身,設(shè)置其在緩存中的有效時(shí)間為第一預(yù)設(shè)時(shí)間;用第二鍵-值對(duì)標(biāo)記該數(shù)據(jù)的預(yù)失效時(shí)間,設(shè)置其在緩存中的有效時(shí)間為第二預(yù)設(shè)時(shí)間;第二預(yù)設(shè)時(shí)間小于第一預(yù)設(shè)時(shí)間;
請(qǐng)求處理單元,適于當(dāng)收到一數(shù)據(jù)請(qǐng)求時(shí),根據(jù)該數(shù)據(jù)請(qǐng)求在所述緩存中查找與請(qǐng)求的數(shù)據(jù)對(duì)應(yīng)的兩個(gè)鍵-值對(duì);如果從緩存查找到第一鍵-值對(duì),但未查找到第二鍵-值對(duì)時(shí),將第一個(gè)鍵對(duì)應(yīng)的值返回給請(qǐng)求方,并向緩存處理單元發(fā)送第一通知;
所述緩存處理單元,進(jìn)一步適于收到第一通知時(shí),從數(shù)據(jù)庫(kù)重新讀取該請(qǐng)求的數(shù)據(jù)來更新緩存中對(duì)應(yīng)的第一鍵-值對(duì)中的值,并重新設(shè)置對(duì)應(yīng)的第二鍵-值對(duì)以及對(duì)應(yīng)的第一預(yù)設(shè)時(shí)間和第二預(yù)設(shè)時(shí)間。
可選地,保存在所述緩存中的數(shù)據(jù)為熱數(shù)據(jù),所述熱數(shù)據(jù)為數(shù)據(jù)庫(kù)中的被訪問頻率高于預(yù)設(shè)值的數(shù)據(jù)。
可選地,所述請(qǐng)求處理單元,進(jìn)一步適于當(dāng)從緩存中查找到第一鍵-值對(duì),也查找到第二鍵-值對(duì)時(shí),將第一鍵-值對(duì)中的值返回給請(qǐng)求方,不作其他處理。
可選地,所述請(qǐng)求處理單元,進(jìn)一步適于當(dāng)從緩存未查找到第一鍵-值對(duì),則從數(shù)據(jù)庫(kù)中獲取該數(shù)據(jù)請(qǐng)求所請(qǐng)求的數(shù)據(jù)返回給請(qǐng)求方。
可選地,所述緩存處理單元,適于將第一鍵-值對(duì)中的值設(shè)置為該條數(shù)據(jù)本身,將第二鍵-值對(duì)中的值設(shè)置為固定值或任意值。
可選地,所述第一預(yù)設(shè)時(shí)間對(duì)應(yīng)的時(shí)間值和第二預(yù)設(shè)時(shí)間對(duì)應(yīng)的時(shí)間值保存在指定位置;
所述緩存處理單元,適于在每次設(shè)置或重置一條數(shù)據(jù)的第一預(yù)設(shè)時(shí)間和第二預(yù)設(shè)時(shí)間,從所述指定位置讀取對(duì)應(yīng)的時(shí)間值并進(jìn)行設(shè)置或重置。
可選地,該裝置進(jìn)一步包括:
參數(shù)調(diào)整單元,適于根據(jù)數(shù)據(jù)的訪問頻率以及緩存的大小,調(diào)整第一預(yù)設(shè)時(shí)間對(duì)應(yīng)的時(shí)間值和第二預(yù)設(shè)時(shí)間對(duì)應(yīng)的時(shí)間值。
根據(jù)本發(fā)明的技術(shù)方案,在進(jìn)行數(shù)據(jù)緩存時(shí)設(shè)置與該數(shù)據(jù)對(duì)應(yīng)的兩個(gè)鍵-值對(duì),第一鍵-值對(duì)存放該數(shù)據(jù)本身,并設(shè)置其在緩存中的有效時(shí)間為第一預(yù)設(shè)時(shí)間,第二鍵-值對(duì)標(biāo)記該數(shù)據(jù)的預(yù)失效時(shí)間,并將其在緩存中的有效時(shí)間為第二預(yù)設(shè)時(shí)間,第一預(yù)設(shè)時(shí)間大于第二預(yù)設(shè)時(shí)間,表示第二鍵-值對(duì)比第一鍵值對(duì)先失效。在訪問數(shù)據(jù)時(shí),如果兩個(gè)鍵-值對(duì)均被查找到,說明該數(shù)據(jù)暫時(shí)不會(huì)失效,不做處理;如果只查找到一個(gè)鍵-值對(duì),說明該數(shù)據(jù)即將失效,則將該數(shù)據(jù)返回給請(qǐng)求方的同時(shí),從數(shù)據(jù)庫(kù)中重新讀取該數(shù)據(jù)并重新設(shè)置失效時(shí)間??梢?,本發(fā)明的技術(shù)方案是隨著用戶訪問的同時(shí),對(duì)緩存中數(shù)據(jù)的失效時(shí)間進(jìn)行檢查,一旦檢查到熱數(shù)據(jù)即將失效,則重新從數(shù)據(jù)庫(kù)中讀取并設(shè)置,從而保證熱數(shù)據(jù)一直存在緩存中,解決緩存中熱數(shù)據(jù)失效的問題,避免請(qǐng)求者從數(shù)據(jù)庫(kù)中訪問熱數(shù)據(jù),影響訪問速度的情況。綜上所述,本發(fā)明能保證緩存中的數(shù)據(jù)不失效,且保證數(shù)據(jù)的訪問速度,增強(qiáng)用戶的體驗(yàn)。
上述說明僅是本發(fā)明技術(shù)方案的概述,為了能夠更清楚了解本發(fā)明的技術(shù)手段,而可依照說明書的內(nèi)容予以實(shí)施,并且為了讓本發(fā)明的上述和其它目的、特征和優(yōu)點(diǎn)能夠更明顯易懂,以下特舉本發(fā)明的具體實(shí)施方式。
附圖說明
通過閱讀下文優(yōu)選實(shí)施方式的詳細(xì)描述,各種其他的優(yōu)點(diǎn)和益處對(duì)于本領(lǐng)域普通技術(shù)人員將變得清楚明了。附圖僅用于示出優(yōu)選實(shí)施方式的目的,而并不認(rèn)為是對(duì)本發(fā)明的限制。而且在整個(gè)附圖中,用相同的參考符號(hào)表示相同的部件。在附圖中:
圖1示出了根據(jù)本發(fā)明一個(gè)實(shí)施例提供的一種緩存數(shù)據(jù)的方法流程示意圖;
圖2示出了根據(jù)本發(fā)明一個(gè)實(shí)施例提供的一種緩存數(shù)據(jù)的裝置示意圖;
圖3示出了根據(jù)本發(fā)明另一個(gè)實(shí)施例提供的一種緩存數(shù)據(jù)的裝置示意圖。
具體實(shí)施方式
下面將參照附圖更詳細(xì)地描述本公開的示例性實(shí)施例。雖然附圖中顯示了本公開的示例性實(shí)施例,然而應(yīng)當(dāng)理解,可以以各種形式實(shí)現(xiàn)本公開而不應(yīng)被這里闡述的實(shí)施例所限制。相反,提供這些實(shí)施例是為了能夠更透徹地理解本公開,并且能夠?qū)⒈竟_的范圍完整的傳達(dá)給本領(lǐng)域的技術(shù)人員。
圖1示出了根據(jù)本發(fā)明一個(gè)實(shí)施例提供的一種緩存數(shù)據(jù)的方法流程示意圖。如圖1所示,該方法包括:
步驟S110,對(duì)于一條數(shù)據(jù),在緩存中設(shè)置與該數(shù)據(jù)對(duì)應(yīng)的兩個(gè)鍵-值對(duì);其中,用第一鍵-值對(duì)存放該數(shù)據(jù)本身,設(shè)置其在緩存中的有效時(shí)間為第一預(yù)設(shè)時(shí)間;用第二鍵-值對(duì)標(biāo)記該數(shù)據(jù)的預(yù)失效時(shí)間,設(shè)置其在緩存中的有效時(shí)間為第二預(yù)設(shè)時(shí)間;第二預(yù)設(shè)時(shí)間小于第一預(yù)設(shè)時(shí)間。
在本步驟中,第一鍵-值對(duì)中的鍵和第二鍵-值對(duì)中的鍵所代表的意義類似,均指該數(shù)據(jù)的關(guān)鍵信息,用戶在請(qǐng)求信息時(shí),通過數(shù)據(jù)的關(guān)鍵信息來進(jìn)行查找,因?yàn)槊總€(gè)數(shù)據(jù)的關(guān)鍵信息都是唯一的,所以當(dāng)用戶針對(duì)一條數(shù)據(jù)進(jìn)行訪問時(shí),只能查找到對(duì)應(yīng)該數(shù)據(jù)的第一鍵-值對(duì)和第二鍵-值對(duì)中的一個(gè)或者兩個(gè)。第一鍵-值對(duì)中的值存儲(chǔ)的內(nèi)容即為數(shù)據(jù)本身,那么用戶請(qǐng)求數(shù)據(jù)時(shí),返回的最終結(jié)果即第一鍵-值對(duì)中的值存儲(chǔ)的內(nèi)容;因?yàn)榈诙I-值對(duì)的作用只是標(biāo)記該數(shù)據(jù)的預(yù)失效時(shí)間,那么第二鍵-值對(duì)中的值不需要有具體的意義。
另,本步驟中的第一預(yù)設(shè)時(shí)間和第二預(yù)設(shè)時(shí)間均為對(duì)應(yīng)數(shù)據(jù)的基本屬性,且第一預(yù)設(shè)時(shí)間大于第二預(yù)設(shè)時(shí)間,意味著第二鍵-值對(duì)比第一鍵-值對(duì)較早達(dá)到失效時(shí)間,率先失效,被緩存刪除。比如,第一預(yù)設(shè)時(shí)間為30ms,第二預(yù)設(shè)時(shí)間為25ms。
那么,在步驟S120中,當(dāng)收到一數(shù)據(jù)請(qǐng)求時(shí),根據(jù)該數(shù)據(jù)請(qǐng)求在緩存中查找與請(qǐng)求的數(shù)據(jù)對(duì)應(yīng)的兩個(gè)鍵-值對(duì);如果從緩存查找到第一鍵-值對(duì),但未查找到第二鍵-值對(duì),說明第二鍵-值對(duì)已經(jīng)失效,且說明存放該數(shù)據(jù)本身第一鍵-值對(duì)也即將失效,則將第一鍵-值對(duì)中的值返回給請(qǐng)求方,從數(shù)據(jù)庫(kù)重新讀取該請(qǐng)求的數(shù)據(jù)來更新緩存中對(duì)應(yīng)的第一鍵-值對(duì)中的值,并重新設(shè)置對(duì)應(yīng)的第二鍵-值對(duì)以及對(duì)應(yīng)的第一預(yù)設(shè)時(shí)間和第二預(yù)設(shè)時(shí)間。
本步驟中,如果從緩存只查找到第一鍵-值對(duì),但未查找到第二鍵-值對(duì),則說明該數(shù)據(jù)即將失效,需要從數(shù)據(jù)庫(kù)重新讀取該請(qǐng)求的數(shù)據(jù)來更新緩存中對(duì)應(yīng)的第一鍵-值對(duì)中的值,并重新設(shè)置對(duì)應(yīng)的第二鍵-值對(duì)以及對(duì)應(yīng)的第一預(yù)設(shè)時(shí)間和第二預(yù)設(shè)時(shí)間,以避免熱數(shù)據(jù)在緩存中失效。步驟S110的例子中,如果從緩存查找到第一鍵-值對(duì),但未查找到第二鍵-值對(duì),則說明第二鍵-值對(duì)已經(jīng)失效,該數(shù)據(jù)的存儲(chǔ)時(shí)間處于25ms到30ms之間,該數(shù)據(jù)對(duì)應(yīng)的第一鍵-值即將失效,因此需要從數(shù)據(jù)庫(kù)重新讀取該數(shù)據(jù)來更新緩存中對(duì)應(yīng)的第一鍵-值對(duì)中的值,并重新設(shè)置對(duì)應(yīng)的第二鍵-值對(duì)以及對(duì)應(yīng)的第一預(yù)設(shè)時(shí)間30ms和第二預(yù)設(shè)時(shí)間25ms。這里的更新,一方面是對(duì)緩存中的數(shù)據(jù)進(jìn)行再存儲(chǔ);另一方面,數(shù)據(jù)庫(kù)中的數(shù)據(jù)是在實(shí)時(shí)變化的,那么在進(jìn)行數(shù)據(jù)的重新讀取時(shí),將更新后的數(shù)據(jù)的值存入緩存中對(duì)應(yīng)的第一鍵-值對(duì)中的值,也起到一個(gè)更新緩存中數(shù)據(jù)的作用。一般情況下,用戶是進(jìn)行當(dāng)前時(shí)間的數(shù)據(jù)的訪問,即使數(shù)據(jù)隨后被更新,也不會(huì)受影響。
根據(jù)本發(fā)明的技術(shù)方案,在進(jìn)行數(shù)據(jù)緩存時(shí)設(shè)置與該數(shù)據(jù)對(duì)應(yīng)的兩個(gè)鍵-值對(duì),第一鍵-值對(duì)存放該數(shù)據(jù)本身,并設(shè)置其在緩存中的有效時(shí)間為第一預(yù)設(shè)時(shí)間,第二鍵-值對(duì)標(biāo)記該數(shù)據(jù)的預(yù)失效時(shí)間,并將其在緩存中的有效時(shí)間為第二預(yù)設(shè)時(shí)間,第一預(yù)設(shè)時(shí)間大于第二預(yù)設(shè)時(shí)間,表示第二鍵-值對(duì)比第一鍵值對(duì)先失效。在訪問數(shù)據(jù)時(shí),如果兩個(gè)鍵-值對(duì)均被查找到,說明該數(shù)據(jù)暫時(shí)不會(huì)失效,不做處理;如果只查找到一個(gè)鍵-值對(duì),說明該數(shù)據(jù)即將失效,則將該數(shù)據(jù)返回給請(qǐng)求方的同時(shí),從數(shù)據(jù)庫(kù)中重新讀取該數(shù)據(jù)并重新設(shè)置失效時(shí)間。可見,本發(fā)明的技術(shù)方案是隨著用戶訪問的同時(shí),對(duì)緩存中數(shù)據(jù)的失效時(shí)間進(jìn)行檢查,一旦檢查到熱數(shù)據(jù)即將失效,則重新從數(shù)據(jù)庫(kù)中讀取并設(shè)置,從而保證熱數(shù)據(jù)一直存在緩存中,解決緩存中熱數(shù)據(jù)失效的問題,避免請(qǐng)求者從數(shù)據(jù)庫(kù)中訪問熱數(shù)據(jù),影響訪問速度的情況。
在本發(fā)明的一個(gè)實(shí)施例中,保存在緩存中的數(shù)據(jù)為熱數(shù)據(jù),首先設(shè)定一個(gè)預(yù)設(shè)值,這里所說的熱數(shù)據(jù)為數(shù)據(jù)庫(kù)中的被訪問頻率高于預(yù)設(shè)值的數(shù)據(jù),該預(yù)設(shè)值根據(jù)緩存的大小以及熱數(shù)據(jù)的量進(jìn)行設(shè)定,若熱數(shù)據(jù)的量比較多,那么設(shè)定一個(gè)標(biāo)準(zhǔn)較高的預(yù)設(shè)值,保證熱數(shù)據(jù)進(jìn)入緩存。因?yàn)榫彺娴拇鎯?chǔ)空間有限,并不是所有的熱數(shù)據(jù)都可以進(jìn)入緩存,只有訪問頻率表較高的熱數(shù)據(jù)才可以進(jìn)入,這里的訪問頻率較高的熱數(shù)據(jù)可以通過第一預(yù)設(shè)時(shí)間進(jìn)行限制,設(shè)定的第一預(yù)設(shè)時(shí)間短,則限定的熱數(shù)據(jù)的訪問時(shí)間的間隔短,即訪問頻率高。
在本發(fā)明的一個(gè)實(shí)施例中,圖1所示的方法進(jìn)一步包括:如果從緩存中查找到第一鍵-值對(duì),也查找到第二鍵-值對(duì),說明該數(shù)據(jù)在下一次被訪問時(shí)還不會(huì)失效,則僅將第一鍵-值對(duì)中的值返回給請(qǐng)求方,不作其他處理。
在本發(fā)明的一個(gè)實(shí)施例中,圖1所示的方法進(jìn)一步包括:如果從緩存未查找到第一鍵-值對(duì),則從數(shù)據(jù)庫(kù)中獲取該數(shù)據(jù)請(qǐng)求所請(qǐng)求的數(shù)據(jù)返回給請(qǐng)求方。因?yàn)楸景l(fā)明的技術(shù)方案可以保證熱數(shù)據(jù)在緩存中,不存在失效問題,所以如果從緩存中未查找到第一鍵-值對(duì),則說明請(qǐng)求的數(shù)據(jù)是非熱數(shù)據(jù),則直接從數(shù)據(jù)庫(kù)中獲取該數(shù)據(jù)請(qǐng)求所請(qǐng)求的數(shù)據(jù)返回給請(qǐng)求方。
在本發(fā)明的一個(gè)實(shí)施例中,步驟S110中,用第一鍵-值對(duì)存放該數(shù)據(jù)本身,用第二鍵-值對(duì)標(biāo)記該數(shù)據(jù)的預(yù)失效時(shí)間包括:將第一鍵-值對(duì)中的值設(shè)置為該條數(shù)據(jù)本身;將第二鍵-值對(duì)中的值設(shè)置為固定值或任意值,這里的固定值或任意值可以為“null”,也可以隨意設(shè)定,但不具有任何意義,請(qǐng)求者進(jìn)行數(shù)據(jù)請(qǐng)求時(shí),得到的返回?cái)?shù)據(jù)為第一鍵-值對(duì)中的值,第二鍵-值對(duì)只是為了配合程序進(jìn)行數(shù)據(jù)失效時(shí)間的檢測(cè)。例如,訪問某一文具供應(yīng)商的數(shù)據(jù)庫(kù),其訪問頻率最高的商品為鉛筆和鋼筆,那么將鉛筆和鋼筆對(duì)應(yīng)的庫(kù)存量數(shù)據(jù)放入緩存,設(shè)置數(shù)據(jù)時(shí),對(duì)應(yīng)鉛筆的數(shù)據(jù),則設(shè)置兩個(gè)鍵-值對(duì),分別為鉛筆-200;鉛筆EX-“null”;對(duì)應(yīng)鋼筆的數(shù)據(jù),則設(shè)置兩個(gè)鍵-值對(duì),分別為鋼筆-300;鋼筆EX-“0”。
為每次進(jìn)行數(shù)據(jù)的設(shè)置或者重置的方便,在本發(fā)明的一個(gè)實(shí)施例中,將第一預(yù)設(shè)時(shí)間對(duì)應(yīng)的時(shí)間值和第二預(yù)設(shè)時(shí)間對(duì)應(yīng)的時(shí)間值保存到指定位置;每次設(shè)置或重置一條數(shù)據(jù)的第一預(yù)設(shè)時(shí)間和第二預(yù)設(shè)時(shí)間時(shí),從指定位置讀取對(duì)應(yīng)的時(shí)間值并進(jìn)行設(shè)置或重置。
進(jìn)一步地,因?yàn)榫彺娴膬?chǔ)存空間有限,為了訪問效率緩存中應(yīng)當(dāng)存儲(chǔ)最熱的數(shù)據(jù),即訪問頻率最高的數(shù)據(jù)。但是熱數(shù)據(jù)不是一成不變的。比如,緩存中只能存儲(chǔ)1000條數(shù)據(jù),在初始時(shí),為了將最熱的1000條數(shù)據(jù)放入緩存中,根據(jù)該最熱的1000條數(shù)據(jù)中的最低訪問頻率設(shè)定第一預(yù)設(shè)時(shí)間為30ms;但是隨著訪問量的改變,訪問頻率蓋與所述最低訪問頻率的數(shù)據(jù)遠(yuǎn)遠(yuǎn)超出1000條,例如有2000條。此時(shí)還將第一預(yù)設(shè)時(shí)間設(shè)置為30ms,緩存已經(jīng)不能將改變后所有的熱數(shù)據(jù)都存儲(chǔ)其中,且新增加的較熱的數(shù)據(jù)可能也進(jìn)不到緩存,即不能保證當(dāng)前最熱的1000條數(shù)據(jù)在緩存中。對(duì)此,在本發(fā)明的一個(gè)實(shí)施例中,為了保證最熱的數(shù)據(jù)能進(jìn)入緩存,一方面可以重新設(shè)定預(yù)設(shè)值,以重新定義熱數(shù)據(jù);另一方面,隨著熱數(shù)據(jù)的訪問頻率和緩存的大小,調(diào)整第一預(yù)設(shè)時(shí)間對(duì)應(yīng)的時(shí)間值和第二預(yù)設(shè)時(shí)間對(duì)應(yīng)的時(shí)間值;每次設(shè)置或重置一條數(shù)據(jù)的第一預(yù)設(shè)時(shí)間和第二預(yù)設(shè)時(shí)間,從指定位置讀取對(duì)應(yīng)的時(shí)間值并進(jìn)行設(shè)置或重置,如果該數(shù)據(jù)的訪問頻率符合重置后的第一預(yù)設(shè)時(shí)間,那么此數(shù)據(jù)為訪問頻率較高的熱數(shù)據(jù),會(huì)一直存儲(chǔ)在緩存中,如果該數(shù)據(jù)的訪問頻率不符合重置后的第一預(yù)設(shè)時(shí)間,則說明該數(shù)據(jù)雖為熱數(shù)據(jù),但是訪問頻率沒有其他數(shù)據(jù)的高,則在該數(shù)據(jù)不會(huì)一直存儲(chǔ)在緩存里。
圖2示出了根據(jù)本發(fā)明一個(gè)實(shí)施例提供的一種緩存數(shù)據(jù)的裝置示意圖。如圖2所示,該緩存數(shù)據(jù)的裝置200包括:
緩存處理單元210,適于對(duì)于一條數(shù)據(jù),在緩存中設(shè)置與該數(shù)據(jù)對(duì)應(yīng)的兩個(gè)鍵-值對(duì);其中,用第一鍵-值對(duì)存放該數(shù)據(jù)本身,設(shè)置其在緩存中的有效時(shí)間為第一預(yù)設(shè)時(shí)間;用第二鍵-值對(duì)標(biāo)記該數(shù)據(jù)的預(yù)失效時(shí)間,設(shè)置其在緩存中的有效時(shí)間為第二預(yù)設(shè)時(shí)間;第二預(yù)設(shè)時(shí)間小于第一預(yù)設(shè)時(shí)間;
請(qǐng)求處理單元220,適于當(dāng)收到一數(shù)據(jù)請(qǐng)求時(shí),根據(jù)該數(shù)據(jù)請(qǐng)求在緩存中查找與請(qǐng)求的數(shù)據(jù)對(duì)應(yīng)的兩個(gè)鍵-值對(duì);如果從緩存查找到第一鍵-值對(duì),但未查找到第二鍵-值對(duì)時(shí),將第一個(gè)鍵對(duì)應(yīng)的值返回給請(qǐng)求方,并向緩存處理單元發(fā)送第一通知;
所述緩存處理單元210,進(jìn)一步適于收到第一通知時(shí),從數(shù)據(jù)庫(kù)重新讀取該請(qǐng)求的數(shù)據(jù)來更新緩存中對(duì)應(yīng)的第一鍵-值對(duì)中的值,并重新設(shè)置對(duì)應(yīng)的第二鍵-值對(duì)以及對(duì)應(yīng)的第一預(yù)設(shè)時(shí)間和第二預(yù)設(shè)時(shí)間。
在本發(fā)明的一個(gè)實(shí)施例中,保存在緩存中的數(shù)據(jù)為熱數(shù)據(jù),熱數(shù)據(jù)為數(shù)據(jù)庫(kù)中的被訪問頻率高于預(yù)設(shè)值的數(shù)據(jù)。
在本發(fā)明的一個(gè)實(shí)施例中,請(qǐng)求處理單元220,進(jìn)一步適于當(dāng)從緩存中查找到第一鍵-值對(duì),也查找到第二鍵-值對(duì)時(shí),將第一鍵-值對(duì)中的值返回給請(qǐng)求方,不作其他處理。
在本發(fā)明的一個(gè)實(shí)施例中,請(qǐng)求處理單元220,進(jìn)一步適于當(dāng)從緩存未查找到第一鍵-值對(duì),則從數(shù)據(jù)庫(kù)中獲取該數(shù)據(jù)請(qǐng)求所請(qǐng)求的數(shù)據(jù)返回給請(qǐng)求方。
在本發(fā)明的一個(gè)實(shí)施例中,緩存處理單元210,適于將第一鍵-值對(duì)中的值設(shè)置為該條數(shù)據(jù)本身,將第二鍵-值對(duì)中的值設(shè)置為固定值或任意值。
在本發(fā)明的一個(gè)實(shí)施例中,第一預(yù)設(shè)時(shí)間對(duì)應(yīng)的時(shí)間值和第二預(yù)設(shè)時(shí)間對(duì)應(yīng)的時(shí)間值保存在指定位置。
則緩存處理單元210,適于在每次設(shè)置或重置一條數(shù)據(jù)的第一預(yù)設(shè)時(shí)間和第二預(yù)設(shè)時(shí)間,從指定位置讀取對(duì)應(yīng)的時(shí)間值并進(jìn)行設(shè)置或重置。
圖3示出了根據(jù)本發(fā)明另一個(gè)實(shí)施例提供的一種緩存數(shù)據(jù)的裝置示意圖。該緩存數(shù)據(jù)的裝置300包括:緩存處理單元310、請(qǐng)求處理單元320和參數(shù)調(diào)整單元230。其中,緩存處理單元310、請(qǐng)求處理單元320和圖2所示裝置的緩存處理單元210、請(qǐng)求處理單元220具有對(duì)應(yīng)相同的功能,相同的部分在此不再贅述。
參數(shù)調(diào)整單元230,適于根據(jù)數(shù)據(jù)的訪問頻率以及緩存的大小,調(diào)整第一預(yù)設(shè)時(shí)間對(duì)應(yīng)的時(shí)間值和第二預(yù)設(shè)時(shí)間對(duì)應(yīng)的時(shí)間值。
需要說明的是,圖2和圖3所示裝置的各實(shí)施例與圖1所示方法的各實(shí)施例對(duì)應(yīng)相同,上文已有詳細(xì)說明,在此不再贅述。
根據(jù)本發(fā)明的技術(shù)方案,在進(jìn)行數(shù)據(jù)緩存時(shí)設(shè)置與該數(shù)據(jù)對(duì)應(yīng)的兩個(gè)鍵-值對(duì),第一鍵-值對(duì)存放該數(shù)據(jù)本身,并設(shè)置其在緩存中的有效時(shí)間為第一預(yù)設(shè)時(shí)間,第二鍵-值對(duì)標(biāo)記該數(shù)據(jù)的預(yù)失效時(shí)間,并將其在緩存中的有效時(shí)間為第二預(yù)設(shè)時(shí)間,第一預(yù)設(shè)時(shí)間大于第二預(yù)設(shè)時(shí)間,表示第二鍵-值對(duì)比第一鍵值對(duì)先失效。在訪問數(shù)據(jù)時(shí),如果兩個(gè)鍵-值對(duì)均被查找到,說明該數(shù)據(jù)暫時(shí)不會(huì)失效,不做處理;如果只查找到一個(gè)鍵-值對(duì),說明該數(shù)據(jù)即將失效,則將該數(shù)據(jù)返回給請(qǐng)求方的同時(shí),從數(shù)據(jù)庫(kù)中重新讀取該數(shù)據(jù)并重新設(shè)置失效時(shí)間??梢?,本發(fā)明的技術(shù)方案是隨著用戶訪問的同時(shí),對(duì)緩存中數(shù)據(jù)的失效時(shí)間進(jìn)行檢查,一旦檢查到熱數(shù)據(jù)即將失效,則重新從數(shù)據(jù)庫(kù)中讀取并設(shè)置,從而保證熱數(shù)據(jù)一直存在緩存中,解決緩存中熱數(shù)據(jù)失效的問題,避免請(qǐng)求者從數(shù)據(jù)庫(kù)中訪問熱數(shù)據(jù),影響訪問速度的情況。綜上所述,本發(fā)明能保證緩存中的數(shù)據(jù)不失效,保證數(shù)據(jù)的訪問速度,增強(qiáng)用戶的體驗(yàn)。
需要說明的是:
在此提供的算法和顯示不與任何特定計(jì)算機(jī)、虛擬裝置或者其它設(shè)備固有相關(guān)。各種通用裝置也可以與基于在此的示教一起使用。根據(jù)上面的描述,構(gòu)造這類裝置所要求的結(jié)構(gòu)是顯而易見的。此外,本發(fā)明也不針對(duì)任何特定編程語(yǔ)言。應(yīng)當(dāng)明白,可以利用各種編程語(yǔ)言實(shí)現(xiàn)在此描述的本發(fā)明的內(nèi)容,并且上面對(duì)特定語(yǔ)言所做的描述是為了披露本發(fā)明的最佳實(shí)施方式。
在此處所提供的說明書中,說明了大量具體細(xì)節(jié)。然而,能夠理解,本發(fā)明的實(shí)施例可以在沒有這些具體細(xì)節(jié)的情況下實(shí)踐。在一些實(shí)例中,并未詳細(xì)示出公知的方法、結(jié)構(gòu)和技術(shù),以便不模糊對(duì)本說明書的理解。
類似地,應(yīng)當(dāng)理解,為了精簡(jiǎn)本公開并幫助理解各個(gè)發(fā)明方面中的一個(gè)或多個(gè),在上面對(duì)本發(fā)明的示例性實(shí)施例的描述中,本發(fā)明的各個(gè)特征有時(shí)被一起分組到單個(gè)實(shí)施例、圖、或者對(duì)其的描述中。然而,并不應(yīng)將該公開的方法解釋成反映如下意圖:即所要求保護(hù)的本發(fā)明要求比在每個(gè)權(quán)利要求中所明確記載的特征更多的特征。更確切地說,如下面的權(quán)利要求書所反映的那樣,發(fā)明方面在于少于前面公開的單個(gè)實(shí)施例的所有特征。因此,遵循具體實(shí)施方式的權(quán)利要求書由此明確地并入該具體實(shí)施方式,其中每個(gè)權(quán)利要求本身都作為本發(fā)明的單獨(dú)實(shí)施例。
本領(lǐng)域那些技術(shù)人員可以理解,可以對(duì)實(shí)施例中的設(shè)備中的模塊進(jìn)行自適應(yīng)性地改變并且把它們?cè)O(shè)置在與該實(shí)施例不同的一個(gè)或多個(gè)設(shè)備中??梢园褜?shí)施例中的模塊或單元或組件組合成一個(gè)模塊或單元或組件,以及此外可以把它們分成多個(gè)子模塊或子單元或子組件。除了這樣的特征和/或過程或者單元中的至少一些是相互排斥之外,可以采用任何組合對(duì)本說明書(包括伴隨的權(quán)利要求、摘要和附圖)中公開的所有特征以及如此公開的任何方法或者設(shè)備的所有過程或單元進(jìn)行組合。除非另外明確陳述,本說明書(包括伴隨的權(quán)利要求、摘要和附圖)中公開的每個(gè)特征可以由提供相同、等同或相似目的的替代特征來代替。
此外,本領(lǐng)域的技術(shù)人員能夠理解,盡管在此所述的一些實(shí)施例包括其它實(shí)施例中所包括的某些特征而不是其它特征,但是不同實(shí)施例的特征的組合意味著處于本發(fā)明的范圍之內(nèi)并且形成不同的實(shí)施例。例如,在下面的權(quán)利要求書中,所要求保護(hù)的實(shí)施例的任意之一都可以以任意的組合方式來使用。
本發(fā)明的各個(gè)部件實(shí)施例可以以硬件實(shí)現(xiàn),或者以在一個(gè)或者多個(gè)處理器上運(yùn)行的軟件模塊實(shí)現(xiàn),或者以它們的組合實(shí)現(xiàn)。本領(lǐng)域的技術(shù)人員應(yīng)當(dāng)理解,可以在實(shí)踐中使用微處理器或者數(shù)字信號(hào)處理器(DSP)來實(shí)現(xiàn)根據(jù)本發(fā)明實(shí)施例的緩存數(shù)據(jù)的裝置中的一些或者全部部件的一些或者全部功能。本發(fā)明還可以實(shí)現(xiàn)為用于執(zhí)行這里所描述的方法的一部分或者全部的設(shè)備或者裝置程序(例如,計(jì)算機(jī)程序和計(jì)算機(jī)程序產(chǎn)品)。這樣的實(shí)現(xiàn)本發(fā)明的程序可以存儲(chǔ)在計(jì)算機(jī)可讀介質(zhì)上,或者可以具有一個(gè)或者多個(gè)信號(hào)的形式。這樣的信號(hào)可以從因特網(wǎng)網(wǎng)站上下載得到,或者在載體信號(hào)上提供,或者以任何其他形式提供。
應(yīng)該注意的是上述實(shí)施例對(duì)本發(fā)明進(jìn)行說明而不是對(duì)本發(fā)明進(jìn)行限制,并且本領(lǐng)域技術(shù)人員在不脫離所附權(quán)利要求的范圍的情況下可設(shè)計(jì)出替換實(shí)施例。在權(quán)利要求中,不應(yīng)將位于括號(hào)之間的任何參考符號(hào)構(gòu)造成對(duì)權(quán)利要求的限制。單詞“包含”不排除存在未列在權(quán)利要求中的元件或步驟。位于元件之前的單詞“一”或“一個(gè)”不排除存在多個(gè)這樣的元件。本發(fā)明可以借助于包括有若干不同元件的硬件以及借助于適當(dāng)編程的計(jì)算機(jī)來實(shí)現(xiàn)。在列舉了若干裝置的單元權(quán)利要求中,這些裝置中的若干個(gè)可以是通過同一個(gè)硬件項(xiàng)來具體體現(xiàn)。單詞第一、第二、以及第三等的使用不表示任何順序。可將這些單詞解釋為名稱。
本發(fā)明提供了A1、一種緩存數(shù)據(jù)的方法,包括:
對(duì)于一條數(shù)據(jù),在緩存中設(shè)置與該數(shù)據(jù)對(duì)應(yīng)的兩個(gè)鍵-值對(duì);其中,用第一鍵-值對(duì)存放該數(shù)據(jù)本身,設(shè)置其在緩存中的有效時(shí)間為第一預(yù)設(shè)時(shí)間;用第二鍵-值對(duì)標(biāo)記該數(shù)據(jù)的預(yù)失效時(shí)間,設(shè)置其在緩存中的有效時(shí)間為第二預(yù)設(shè)時(shí)間;第二預(yù)設(shè)時(shí)間小于第一預(yù)設(shè)時(shí)間;
當(dāng)收到一數(shù)據(jù)請(qǐng)求時(shí),根據(jù)該數(shù)據(jù)請(qǐng)求在所述緩存中查找與請(qǐng)求的數(shù)據(jù)對(duì)應(yīng)的兩個(gè)鍵-值對(duì);如果從緩存查找到第一鍵-值對(duì),但未查找到第二鍵-值對(duì),則將第一鍵-值對(duì)中的值返回給請(qǐng)求方,從數(shù)據(jù)庫(kù)重新讀取該請(qǐng)求的數(shù)據(jù)來更新緩存中對(duì)應(yīng)的第一鍵-值對(duì)中的值,并重新設(shè)置對(duì)應(yīng)的第二鍵-值對(duì)以及對(duì)應(yīng)的第一預(yù)設(shè)時(shí)間和第二預(yù)設(shè)時(shí)間。
A2、如A1所述的方法,其中,
保存在所述緩存中的數(shù)據(jù)為熱數(shù)據(jù),所述熱數(shù)據(jù)為數(shù)據(jù)庫(kù)中的被訪問頻率高于預(yù)設(shè)值的數(shù)據(jù)。
A3、如A1所述的方法,其中,該方法進(jìn)一步包括:
如果從緩存中查找到第一鍵-值對(duì),也查找到第二鍵-值對(duì),則將第一鍵-值對(duì)中的值返回給請(qǐng)求方,不作其他處理。
A4、如A1所述的方法,其中,該方法進(jìn)一步包括:
如果從緩存未查找到第一鍵-值對(duì),則從數(shù)據(jù)庫(kù)中獲取該數(shù)據(jù)請(qǐng)求所請(qǐng)求的數(shù)據(jù)返回給請(qǐng)求方。
A5、如A1所述的方法,其中,所述用第一鍵-值對(duì)存放該數(shù)據(jù)本身,用第二鍵-值對(duì)標(biāo)記該數(shù)據(jù)的預(yù)失效時(shí)間包括:
將第一鍵-值對(duì)中的值設(shè)置為該條數(shù)據(jù)本身;
將第二鍵-值對(duì)中的值設(shè)置為固定值或任意值。
A6、如A1-A5中任一項(xiàng)所述的方法,其中,
將所述第一預(yù)設(shè)時(shí)間對(duì)應(yīng)的時(shí)間值和第二預(yù)設(shè)時(shí)間對(duì)應(yīng)的時(shí)間值保存到指定位置;
每次設(shè)置或重置一條數(shù)據(jù)的第一預(yù)設(shè)時(shí)間和第二預(yù)設(shè)時(shí)間,從所述指定位置讀取對(duì)應(yīng)的時(shí)間值并進(jìn)行設(shè)置或重置。
A7、如A6所述的方法,其中,該方法進(jìn)一步包括:
根據(jù)數(shù)據(jù)的訪問頻率以及緩存的大小,調(diào)整第一預(yù)設(shè)時(shí)間對(duì)應(yīng)的時(shí)間值和第二預(yù)設(shè)時(shí)間對(duì)應(yīng)的時(shí)間值。
本發(fā)明還提供了B8、一種緩存數(shù)據(jù)的裝置,其中,該裝置包括:
緩存處理單元,適于對(duì)于一條數(shù)據(jù),在緩存中設(shè)置與該數(shù)據(jù)對(duì)應(yīng)的兩個(gè)鍵-值對(duì);其中,用第一鍵-值對(duì)存放該數(shù)據(jù)本身,設(shè)置其在緩存中的有效時(shí)間為第一預(yù)設(shè)時(shí)間;用第二鍵-值對(duì)標(biāo)記該數(shù)據(jù)的預(yù)失效時(shí)間,設(shè)置其在緩存中的有效時(shí)間為第二預(yù)設(shè)時(shí)間;第二預(yù)設(shè)時(shí)間小于第一預(yù)設(shè)時(shí)間;
請(qǐng)求處理單元,適于當(dāng)收到一數(shù)據(jù)請(qǐng)求時(shí),根據(jù)該數(shù)據(jù)請(qǐng)求在所述緩存中查找與請(qǐng)求的數(shù)據(jù)對(duì)應(yīng)的兩個(gè)鍵-值對(duì);如果從緩存查找到第一鍵-值對(duì),但未查找到第二鍵-值對(duì)時(shí),將第一個(gè)鍵對(duì)應(yīng)的值返回給請(qǐng)求方,并向緩存處理單元發(fā)送第一通知;
所述緩存處理單元,進(jìn)一步適于收到第一通知時(shí),從數(shù)據(jù)庫(kù)重新讀取該請(qǐng)求的數(shù)據(jù)來更新緩存中對(duì)應(yīng)的第一鍵-值對(duì)中的值,并重新設(shè)置對(duì)應(yīng)的第二鍵-值對(duì)以及對(duì)應(yīng)的第一預(yù)設(shè)時(shí)間和第二預(yù)設(shè)時(shí)間。
B9、如B8所述的裝置,其中,
保存在所述緩存中的數(shù)據(jù)為熱數(shù)據(jù),所述熱數(shù)據(jù)為數(shù)據(jù)庫(kù)中的被訪問頻率高于預(yù)設(shè)值的數(shù)據(jù)。
B10、如B8所述的裝置,其中,
所述請(qǐng)求處理單元,進(jìn)一步適于當(dāng)從緩存中查找到第一鍵-值對(duì),也查找到第二鍵-值對(duì)時(shí),將第一鍵-值對(duì)中的值返回給請(qǐng)求方,不作其他處理。
B11、如B8所述的裝置,其中,
所述請(qǐng)求處理單元,進(jìn)一步適于當(dāng)從緩存未查找到第一鍵-值對(duì),則從數(shù)據(jù)庫(kù)中獲取該數(shù)據(jù)請(qǐng)求所請(qǐng)求的數(shù)據(jù)返回給請(qǐng)求方。
B12、如B8所述的裝置,其中,
所述緩存處理單元,適于將第一鍵-值對(duì)中的值設(shè)置為該條數(shù)據(jù)本身,將第二鍵-值對(duì)中的值設(shè)置為固定值或任意值。
B13、如B8-B12中任一項(xiàng)所述的裝置,其中,所述第一預(yù)設(shè)時(shí)間對(duì)應(yīng)的時(shí)間值和第二預(yù)設(shè)時(shí)間對(duì)應(yīng)的時(shí)間值保存在指定位置;
所述緩存處理單元,適于在每次設(shè)置或重置一條數(shù)據(jù)的第一預(yù)設(shè)時(shí)間和第二預(yù)設(shè)時(shí)間,從所述指定位置讀取對(duì)應(yīng)的時(shí)間值并進(jìn)行設(shè)置或重置。
B14、如B13所述的裝置,其中,該裝置進(jìn)一步包括:
參數(shù)調(diào)整單元,適于根據(jù)數(shù)據(jù)的訪問頻率以及緩存的大小,調(diào)整第一預(yù)設(shè)時(shí)間對(duì)應(yīng)的時(shí)間值和第二預(yù)設(shè)時(shí)間對(duì)應(yīng)的時(shí)間值。