訪問數據庫的方法及裝置的制造方法
【專利摘要】本發明提供了一種訪問數據庫的方法及裝置,該方法包括:接收來自客戶端的訪問數據庫的請求;對所述請求進行類型分析,以確定所述請求是否為數據寫入請求;以及當所述請求為數據寫入請求時,將所述請求相應的寫入操作記錄至本地日志,并將所述請求相應的數據寫入所述數據庫的緩存層。本發明實施例直接將數據寫入請求相應的數據寫入數據庫的緩存層,并向客戶端返回響應消息,其能夠提高后續對所述數據讀取的效率。
【專利說明】
訪問數據庫的方法及裝置
技術領域
[0001]本發明涉及計算機技術領域,特別是一種訪問數據庫的方法及裝置。
【背景技術】
[0002]隨著社會的發展,大量的數據需要存儲起來,對存儲的數據,根據不同用戶的需求應用一定的數據訪問方法進行處理,數據庫就是適應這種需求的一種技術。簡單來說,數據庫是數據以一種能夠持久保存,并且可以被操作的方式來保存的數據集合。
[0003]在實際應用中,用戶可以對數據庫中的數據進行讀寫操作,如增加、刪除、修改、查詢等操作。相關技術中,以Ieveldb為代表的LSM Tree數據庫為例,當用戶對數據庫中的熱數據進行讀取操作時,數據庫接收到用戶客戶端發出的讀取操作請求后,會從本地文件中去查找,之后向用戶客戶端返回響應消息。這樣的讀取方式,其讀性能較低,滿足不了需要大量請求熱數據的情況。因而,亟待解決這一技術問題。
【發明內容】
[0004]鑒于上述問題,提出了本發明以便提供一種克服上述問題或者至少部分地解決上述問題的訪問數據庫的方法及相應的裝置。
[0005]依據本發明的一方面,提供了一種訪問數據庫的方法,包括:
[0006]接收來自客戶端的訪問數據庫的請求;
[0007]對所述請求進行類型分析,以確定所述請求是否為數據寫入請求;以及
[0008]當所述請求為數據寫入請求時,將所述請求相應的寫入操作記錄至本地日志,并將所述請求相應的數據寫入所述數據庫的緩存層。
[0009]可選地,所述方法還包括:
[0010]當所述請求為數據的讀取請求時,在所述緩存層中查找所述請求相應的數據,并將查找到的所述數據返回給所述客戶端。
[0011 ] 可選地,所述將所述請求相應的寫入操作記錄至本地日志,并將所述請求相應的數據寫入所述數據庫的緩存層的步驟進一步包括:
[0012]調用第一線程,并利用所述第一線程將所述請求相應的寫入操作記錄至所述本地日志并將所述請求相應的數據寫入所述緩存層。
[0013]可選地,所述方法還包括:
[0014]調用第二線程并利用所述第二線程掃描所述本地日志以確定所述本地日志中是否存在日志增量,其中所述第二線程與所述第一線程異步;以及
[0015]若發現所述本地日志中存在日志增量,則將所述日志增量相應的數據寫入所述數據庫中。
[0016]可選地,所述利用所述第二線程掃描所述本地日志以確定所述本地日志中是否存在日志增量的步驟進一步包括:
[0017]利用所述第二線程掃描所述本地日志,確定所述本地日志中是否存在未被標記的日志記錄;以及
[0018]若是,則確定所述未被標記的日志記錄為所述日志增量。
[0019]可選地,所述將所述日志增量相應的數據寫入所述數據庫中之后,所述方法還包括:
[0020]在所述本地日志中對所述日志增量相應的日志記錄進行標記。
[0021 ] 可選地,所述方法還包括:
[0022]刪除所述本地日志中已被標記的日志記錄。
[0023]可選地,所述方法還包括:
[0024]在所述數據庫出現故障重新啟動后,掃描所述本地日志,確定所述本地日志中是否存在未被標記的日志記錄;以及
[0025]若是,則將所述未被標記的日志記錄相應的數據寫入所述數據庫,并在所述本地日志中對所述未被標記的日志記錄進行標記。
[0026]可選地,所述方法還包括:
[0027]當所述請求為數據的讀取請求時,若在所述緩存層中未查找到所述請求相應的數據,則將所述請求轉發至所述數據庫;以及
[0028]在所述數據庫中查找所述請求相應的數據,將查找到的所述請求相應的數據返回給所述客戶端,并在所述緩存層中緩存所述請求相應的數據。
[0029]可選地,所述緩存層為分布式的高速緩存系統memcached。
[0030]依據本發明的另一方面,還提供了一種訪問數據庫的裝置,包括:
[0031]請求接收模塊,適于接收來自客戶端的訪問數據庫的請求;
[0032]請求分析模塊,適于對所述請求進行類型分析,以確定所述請求是否為數據寫入請求;以及
[0033]第一寫入模塊,適于當所述請求分析模塊確定所述請求為數據的寫入請求時,將所述請求相應的寫入操作記錄至本地日志,并將所述請求相應的數據寫入所述數據庫的緩存層。
[0034]可選地,所述裝置還包括:
[0035]讀取模塊,適于當所述請求分析模塊確定所述請求為數據的讀取請求時,在所述緩存層中查找所述請求相應的數據,并將查找到的所述數據返回給所述客戶端。
[0036]可選地,所述第一寫入模塊還適于:
[0037]調用第一線程,并利用所述第一線程將所述請求相應的寫入操作記錄至所述本地日志并將所述請求相應的數據寫入所述緩存層。
[0038]可選地,所述裝置還包括:
[0039]第二寫入模塊,適于調用第二線程并利用所述第二線程掃描所述本地日志以確定所述本地日志中是否存在日志增量,其中所述第二線程與所述第一線程異步;以及若發現所述本地日志中存在日志增量,則將所述日志增量相應的數據寫入所述數據庫中。
[0040]可選地,所述第二寫入模塊還適于:
[0041 ]利用所述第二線程掃描所述本地日志,確定所述本地日志中是否存在未被標記的日志記錄;以及
[0042]若是,則確定所述未被標記的日志記錄為所述日志增量。
[0043]可選地,所述裝置還包括:
[0044]標記模塊,適于在所述第二寫入模塊將所述日志增量相應的數據寫入所述數據庫中之后,在所述本地日志中對所述日志增量相應的日志記錄進行標記。
[0045]可選地,所述裝置還包括:
[0046]刪除模塊,適于刪除所述本地日志中已被標記的日志記錄。
[0047]可選地,所述裝置還包括:
[0048]故障處理模塊,適于在所述數據庫出現故障重新啟動后,掃描所述本地日志,確定所述本地日志中是否存在未被標記的日志記錄;以及
[0049]若是,則將所述未被標記的日志記錄相應的數據寫入所述數據庫,并在所述本地日志中對所述未被標記的日志記錄進行標記。
[0050]可選地,所述讀取模塊還適于:
[0051]當所述請求分析模塊確定所述請求為數據的讀取請求時,若在所述緩存層中未查找到所述請求相應的數據,則將所述請求轉發至所述數據庫;以及
[0052]在所述數據庫中查找所述請求相應的數據,將查找到的所述請求相應的數據返回給所述客戶端,并在所述緩存層中緩存所述請求相應的數據。
[0053]可選地,所述緩存層為分布式的高速緩存系統memcached。
[0054]在本發明實施例中,當接收到來自客戶端的訪問數據庫的請求時,對該請求進行類型分析以確定該請求是否為數據寫入請求。當確定該請求為數據寫入請求時,將該數據寫入請求相應的寫入操作記錄至本地日志,并將該數據寫入請求相應的數據寫入數據庫的緩存層。由此可知,本發明實施例直接將數據寫入請求相應的數據寫入數據庫的緩存層,并向客戶端返回響應消息,其能夠提升后續對所述數據讀取的效率。并且,本發明實施例將數據寫入請求相應的寫入操作記錄至本地日志,從而可以利用本地日志異步地將寫入請求相應的數據寫入數據庫,保證數據庫中數據的持久化和完整性。另外,在數據庫出現故障重新啟動后,也可以利用本地日志對數據庫進行數據恢復,實現故障修復的目的。
[0055]上述說明僅是本發明技術方案的概述,為了能夠更清楚了解本發明的技術手段,而可依照說明書的內容予以實施,并且為了讓本發明的上述和其它目的、特征和優點能夠更明顯易懂,以下特舉本發明的【具體實施方式】。
[0056]根據下文結合附圖對本發明具體實施例的詳細描述,本領域技術人員將會更加明了本發明的上述以及其他目的、優點和特征。
【附圖說明】
[0057]通過閱讀下文優選實施方式的詳細描述,各種其他的優點和益處對于本領域普通技術人員將變得清楚明了。附圖僅用于示出優選實施方式的目的,而并不認為是對本發明的限制。而且在整個附圖中,用相同的參考符號表示相同的部件。在附圖中:
[0058]圖1示出了根據本發明一個實施例的訪問數據庫的方法的流程示意圖;
[0059]圖2示出了根據本發明另一個實施例的訪問數據庫的方法的流程示意圖;
[0060]圖3示出了根據本發明一個實施例的訪問數據庫的裝置的結構示意圖;以及
[0061]圖4示出了根據本發明另一個實施例的訪問數據庫的裝置的結構示意圖。
【具體實施方式】
[0062]下面將參照附圖更詳細地描述本公開的示例性實施例。雖然附圖中顯示了本公開的示例性實施例,然而應當理解,可以以各種形式實現本公開而不應被這里闡述的實施例所限制。相反,提供這些實施例是為了能夠更透徹地理解本公開,并且能夠將本公開的范圍完整的傳達給本領域的技術人員。
[0063]為解決上述技術問題,本發明實施例提供了一種訪問數據庫的方法。圖1示出了根據本發明一個實施例的訪問數據庫的方法的流程示意圖。如圖1所示,該方法至少可以包括步驟S102、步驟S104以及步驟S106:
[0064]步驟S102,接收來自客戶端的訪問數據庫的請求;
[0065]步驟S104,對該請求進行類型分析,以確定該請求是否為數據寫入請求;
[0066]步驟S106,當該請求為數據寫入請求時,將該請求相應的寫入操作記錄至本地日志,并將該請求相應的數據寫入數據庫的緩存層。
[0067]在該步驟中,本地日志是指數據庫在本地物理機上硬盤存儲的日志文件,它用來記錄數據庫被訪問的操作。
[0068]在本發明實施例中,當接收到來自客戶端的訪問數據庫的請求時,對該請求進行類型分析以確定該請求是否為數據寫入請求。當確定該請求為數據寫入請求時,將該數據寫入請求相應的寫入操作記錄至本地日志,并將該數據寫入請求相應的數據寫入數據庫的緩存層。由此可知,本發明實施例直接將數據寫入請求相應的數據寫入數據庫的緩存層,并向客戶端返回響應消息,而無需將數據寫入數據庫,能夠提高后續對所述數據讀取的效率。并且,本發明實施例將數據寫入請求相應的寫入操作記錄至本地日志,從而可以利用本地日志異步地將寫入請求相應的數據寫入數據庫,保證數據庫中數據的持久化和完整性。另夕卜,在數據庫出現故障重新啟動后,也可以利用本地日志對數據庫進行數據恢復,實現故障修復的目的。
[0069]在本發明的可選實施例中,為了提高數據庫訪問的安全性,在上文步驟S102接收到來自客戶端的訪問數據庫的請求后,可以對該請求的合法性進行驗證,在驗證通過后進行后續的步驟S104以及步驟S106,若驗證不通過,則進行攔截處理,并發出告警提示。這里的合法性是根據預先設置的安全認證策略來度量的,安全認證策略可以包括權限的合法性、請求的有效性或者攻擊檢查等,本發明不限于此。例如,安全認證策略可以設置為根據哪個IP地址的客戶端對數據庫的查詢是不允許的;除了某個IP地址外的客戶端是不能刪除、修改數據庫中的數據,等等策略。
[0070]在本發明的可選實施例中,在步驟S104對該請求進行類型分析時,可以從該請求中解析出訪問數據庫的語句,分析該語句是哪種類型的操作,從而確定該請求是否為數據寫入請求。這里的類型如增加、刪除、修改、查詢等,當語句為增加操作的語句時,則確定該請求為數據寫入請求;當語句為刪除操作的語句時,則確定該請求為數據寫入請求;當語句為修改操作的語句時,則確定該請求為數據寫入請求;當語句為查詢操作的語句時,則確定該請求為數據讀取請求,等等。
[0071]在本發明的可選實施例中,上文步驟S106中提及的緩存層可以是在數據庫之外新建的緩存層。由于數據庫本身不具備緩存層,本發明實施例選擇在數據庫之外新建緩存層用于臨時存儲數據。例如,在將寫入請求相應的寫入操作記錄至本地日志后,將寫入請求相應的數據寫入新建的緩存層,并向客戶端返回響應消息,從而提高后續對所述數據讀取的效率。這里,可以根據業務需求選取相應存儲容量的緩存層,緩存層的類型可以如分布式的高速緩存系統memcached或者基于內容存的redis等。
[0072]在本發明的可選實施例中,上文步驟S106將該請求相應的寫入操作記錄至本地日志,并將該請求相應的數據寫入數據庫的緩存層,本發明實施例提供了一種可選的方案,在該方案中,可以調用第一線程,并利用第一線程將請求相應的寫入操作記錄至本地日志并將請求相應的數據寫入緩存層。也就是說,由第一線程將請求相應的寫入操作記錄至本地日志,隨后將請求相應的數據寫入緩存層,之后向客戶端返回表示已完成數據庫寫入的響應消息。
[0073]進一步地,為了保證數據庫中數據的持久化和完整性,本發明實施例可以利用本地日志異步地將寫入請求相應的數據寫入數據庫,即,調用第二線程并利用第二線程掃描本地日志以確定本地日志中是否存在日志增量,其中第二線程與第一線程異步,若發現本地日志中存在日志增量,則將日志增量相應的數據寫入數據庫中。這里,第二線程可以實時地對本地日志進行掃描,也可以設定指定的掃描周期(如0.5秒或I秒等)對本地日志進行掃描。
[0074]在本發明的可選實施例中,在確定日志增量時,本發明實施例提供了一種可選的方案,即,利用第二線程掃描本地日志,確定本地日志中是否存在未被標記的日志記錄,若存在未被標記的日志記錄,則確定未被標記的日志記錄為日志增量。進一步地,將日志增量相應的數據寫入數據庫中之后,在本地日志中對日志增量相應的日志記錄進行標記,以表示日志增量相應的數據已寫入數據庫中,可以避免重復寫入的問題。例如,將日志增量相應的數據寫入數據庫中之后,可以在本地日志中標記日志增量相應的日志記錄為“已操作”或“EL記錄”等。
[0075]在本發明的可選實施例中,為了節省本地存儲空間,可以刪除本地日志中已被標記的日志記錄,例如,對本地日志進行設置,每隔預定時間可以刪除已被標記的日志記錄。另外,本地日志可以按照大小切分,當某個切分區域中的日志記錄已全部被標記,則可以刪除該切分區域中的日志記錄。
[0076]在本發明的可選實施例中,如果因為宕機或其他因素導致數據庫出現故障,使得新寫在緩存層中的數據還未在數據庫中持久化,則在下次重啟數據庫后,可以利用本地日志對數據庫進行數據恢復,實現故障修復的目的。具體地,在數據庫出現故障重新啟動后,啟用掃描線程,并利用掃描線程掃描本地日志,確定本地日志中是否存在未被標記的日志記錄,若是,則將未被標記的日志記錄相應的數據寫入數據庫,并在本地日志中對未被標記的日志記錄進行標記。例如,新寫在緩存層中的數據“b = 2”未在數據庫中持久化(“b = 2”相應的寫入操作已記錄至本地日志),數據庫突發故障,在數據庫重新啟動后,啟用掃描線程,并利用掃描線程掃描本地日志,發現本地日志中存在未被標記的日志記錄,即“b = 2”相應的寫入操作,則將“b = 2”寫入數據庫,并在本地日志中對未被標記的日志記錄(即“b = 2”相應的寫入操作)進行標記,如標記為“已操作”或“已記錄”等。
[0077]進一步地,在數據恢復后數據庫正常工作,緩存層中也有新的數據寫入(這里,可以采用前文提及的第一線程將請求相應的寫入操作記錄至本地日志并將請求相應的數據寫入緩存層),此時可以繼續利用掃描線程掃描本地日志,以確定本地日志中是否存在日志增量,若發現本地日志中存在日志增量,則將日志增量相應的數據寫入數據庫中。這里的掃描線程與前文提及的第二線程作用相同,掃描線程與第一線程異步。
[0078]在本發明的可選實施例中,由于在緩存層對數據進行了緩存,因而當來自客戶端的訪問數據庫的請求為數據的讀取請求時,則可以直接在緩存層中查找該讀取請求相應的數據,并將查找到的數據返回給客戶端,從而可以減少對數據庫的讀取訪問,提高數據讀取的效率。
[0079]在本發明的可選實施例中,如果數據庫故障或其他因素導致緩存層數據部分或全部丟失,使得在緩存層中未查找到讀取請求相應的數據,則本發明實施例可以將讀取請求轉發至數據庫,在數據庫中查找讀取請求相應的數據,將查找到的讀取請求相應的數據返回給客戶端,并在緩存層中緩存讀取請求相應的數據。
[0080]下面將通過一具體實施例詳細介紹本發明的訪問數據庫的方法的實現過程。在該實施例中,根據業務需求選取相應存儲容量的緩存層,為數據庫新建緩存層,緩存層的類型可以如分布式的高速緩存系統memcached或者基于內存的redis等。
[0081]圖2示出了根據本發明另一個實施例的訪問數據庫的方法的流程示意圖。如圖2所示,該方法至少可以包括步驟S202、步驟S204、步驟S206、步驟S208以及步驟S210。
[0082]步驟S202,為數據庫新建緩存層,接收來自客戶端的訪問數據庫的請求。
[0083]步驟S204,對該請求進行類型分析,確定該請求是否為數據寫入請求,若是,則繼續執行步驟S206;若否,則繼續執行步驟S208。
[0084]步驟S206,調用第一線程,并利用第一線程將請求相應的寫入操作記錄至本地日志并將請求相應的數據寫入緩存層。
[0085]在該步驟中,本地日志是指數據庫在本地物理機上硬盤存儲的日志文件,它用來記錄數據庫被訪問的操作。
[0086]步驟S208,當來自客戶端的訪問數據庫的請求為數據的讀取請求時,在緩存層中查找該讀取請求相應的數據,并將查找到的數據返回給客戶端。
[0087]在該步驟中,如果數據庫故障或其他因素導致緩存層數據部分或全部丟失,使得在緩存層中未查找到讀取請求相應的數據,則本發明實施例可以將讀取請求轉發至數據庫,在數據庫中查找讀取請求相應的數據,將查找到的讀取請求相應的數據返回給客戶端,并在緩存層中緩存讀取請求相應的數據。
[0088]步驟S210,調用第二線程并利用第二線程掃描本地日志以確定本地日志中是否存在日志增量,其中第二線程與第一線程異步,若發現本地日志中存在日志增量,則將日志增量相應的數據寫入數據庫中。
[0089]在確定日志增量時,可以利用第二線程掃描本地日志,確定本地日志中是否存在未被標記的日志記錄,若存在未被標記的日志記錄,則確定未被標記的日志記錄為日志增量。進一步地,將日志增量相應的數據寫入數據庫中之后,在本地日志中對日志增量相應的日志記錄進行標記,以表示日志增量相應的數據已寫入數據庫中,可以避免重復寫入的問題。例如,將日志增量相應的數據寫入數據庫中之后,可以在本地日志中標記日志增量相應的日志記錄為“已操作”或“已記錄”等。另外,為了節省本地存儲空間,可以刪除本地日志中已被標記的日志記錄。
[0090]在本發明實施例中,如果因為宕機或其他因素導致數據庫出現故障,使得新寫在緩存層中的數據還未在數據庫中持久化,則在下次重啟數據庫后,可以利用本地日志對數據庫進行數據恢復,實現故障修復的目的。具體地,在數據庫出現故障重新啟動后,啟用掃描線程,并利用掃描線程掃描本地日志,確定本地日志中是否存在未被標記的日志記錄,若是,則將未被標記的日志記錄相應的數據寫入數據庫,并在本地日志中對未被標記的日志記錄進行標記。
[0091]進一步地,在數據恢復后數據庫正常工作,緩存層中也有新的數據寫入(這里,可以采用前文提及的第一線程將請求相應的寫入操作記錄至本地日志并將請求相應的數據寫入緩存層),此時可以繼續利用掃描線程掃描本地日志,以確定本地日志中是否存在日志增量,若發現本地日志中存在日志增量,則將日志增量相應的數據寫入數據庫中。這里的掃描線程與前文提及的第二線程作用相同,掃描線程與第一線程異步。
[0092]需要說明的是,在實際應用中,上述所有可選實施方式可以采用結合的方式任意組合,形成本發明的可選實施例,在此不再一一贅述。
[0093]基于上文各個實施例提供的訪問數據庫的方法,基于同一發明構思,本發明實施例還提供了一種訪問數據庫的裝置。
[0094]圖3示出了根據本發明一個實施例的訪問數據庫的裝置的結構示意圖。如圖3所示,該裝置300至少可以包括請求接收模塊310、請求分析模塊320以及第一寫入模塊330。
[0095]現介紹本發明實施例的訪問數據庫的裝置300的各組成或器件的功能以及各部分間的連接關系:
[0096]請求接收模塊310,適于接收來自客戶端的訪問數據庫的請求;
[0097]請求分析模塊320,與請求接收模塊310相親合,適于對請求進行類型分析,以確定請求是否為數據寫入請求;以及
[0098]第一寫入模塊330,與請求分析模塊320相親合,適于當請求分析模塊確定請求為數據的寫入請求時,將請求相應的寫入操作記錄至本地日志,并將請求相應的數據寫入數據庫的緩存層。
[0099]在本發明一實施例中,如圖4所示,圖3展示的裝置還可以包括:
[0100]讀取模塊340,與請求分析模塊320、第一寫入模塊330相耦合,適于當請求分析模塊320確定請求為數據的讀取請求時,在緩存層中查找請求相應的數據,并將查找到的數據返回給客戶端。
[0101 ]在本發明一實施例中,第一寫入模塊330還適于:
[0102]調用第一線程,并利用第一線程將請求相應的寫入操作記錄至本地日志并將請求相應的數據寫入緩存層。
[0103]在本發明一實施例中,如圖4所示,圖3展示的裝置還可以包括:
[0104]第二寫入模塊350,與第一寫入模塊330相耦合,適于調用第二線程并利用第二線程掃描本地日志以確定本地日志中是否存在日志增量,其中第二線程與第一線程異步;以及若發現本地日志中存在日志增量,則將日志增量相應的數據寫入數據庫中。
[0105]在本發明一實施例中,第二寫入模塊350還適于:
[0106]利用第二線程掃描本地日志,確定本地日志中是否存在未被標記的日志記錄;以及
[0107]若是,則確定未被標記的日志記錄為日志增量。
[0108]在本發明一實施例中,如圖4所示,圖3展示的裝置還可以包括:
[0?09]標記模塊360,與第二寫入模塊350相親合,適于在第二寫入模塊350將日志增量相應的數據寫入數據庫中之后,在本地日志中對日志增量相應的日志記錄進行標記。
[0110]在本發明一實施例中,如圖4所示,圖3展示的裝置還可以包括:
[0111]刪除模塊370,與標記模塊360相耦合,適于刪除本地日志中已被標記的日志記錄。
[0112]在本發明一實施例中,如圖4所示,圖3展示的裝置還可以包括:
[0113]故障處理模塊380,與第一寫入模塊330、標記模塊360相耦合,適于在數據庫出現故障重新啟動后,掃描本地日志,確定本地日志中是否存在未被標記的日志記錄;以及
[0114]若是,則將未被標記的日志記錄相應的數據寫入數據庫,并在本地日志中對未被標記的日志記錄進行標記。
[0115]在本發明一實施例中,讀取模塊340還適于:
[0116]當請求分析模塊確定請求為數據的讀取請求時,若在緩存層中未查找到請求相應的數據,則將請求轉發至數據庫;
[0117]在數據庫中查找請求相應的數據,將查找到的請求相應的數據返回給客戶端,并在緩存層中緩存請求相應的數據。
[0118]在本發明一實施例中,緩存層為分布式的高速緩存系統memcached。
[0119]根據上述任意一個優選實施例或多個優選實施例的組合,本發明實施例能夠達到如下有益效果:
[0120]在本發明實施例中,當接收到來自客戶端的訪問數據庫的請求時,對該請求進行類型分析以確定該請求是否為數據寫入請求。當確定該請求為數據寫入請求時,將該數據寫入請求相應的寫入操作記錄至本地日志,并將該數據寫入請求相應的數據寫入數據庫的緩存層。由此可知,本發明實施例直接將數據寫入請求相應的數據寫入數據庫的緩存層,并向客戶端返回響應消息,其能夠提高后續對所述數據讀取的效率。并且,本發明實施例將數據寫入請求相應的寫入操作記錄至本地日志,從而可以利用本地日志異步地將寫入請求相應的數據寫入數據庫,保證數據庫中數據的持久化和完整性。另外,在數據庫出現故障重新啟動后,也可以利用本地日志對數據庫進行數據恢復,實現故障修復的目的。
[0121]在此處所提供的說明書中,說明了大量具體細節。然而,能夠理解,本發明的實施例可以在沒有這些具體細節的情況下實踐。在一些實例中,并未詳細示出公知的方法、結構和技術,以便不模糊對本說明書的理解。
[0122]類似地,應當理解,為了精簡本公開并幫助理解各個發明方面中的一個或多個,在上面對本發明的示例性實施例的描述中,本發明的各個特征有時被一起分組到單個實施例、圖、或者對其的描述中。然而,并不應將該公開的方法解釋成反映如下意圖:即所要求保護的本發明要求比在每個權利要求中所明確記載的特征更多的特征。更確切地說,如下面的權利要求書所反映的那樣,發明方面在于少于前面公開的單個實施例的所有特征。因此,遵循【具體實施方式】的權利要求書由此明確地并入該【具體實施方式】,其中每個權利要求本身都作為本發明的單獨實施例。
[0123]本領域那些技術人員可以理解,可以對實施例中的設備中的模塊進行自適應性地改變并且把它們設置在與該實施例不同的一個或多個設備中。可以把實施例中的模塊或單元或組件組合成一個模塊或單元或組件,以及此外可以把它們分成多個子模塊或子單元或子組件。除了這樣的特征和/或過程或者單元中的至少一些是相互排斥之外,可以采用任何組合對本說明書(包括伴隨的權利要求、摘要和附圖)中公開的所有特征以及如此公開的任何方法或者設備的所有過程或單元進行組合。除非另外明確陳述,本說明書(包括伴隨的權利要求、摘要和附圖)中公開的每個特征可以由提供相同、等同或相似目的的替代特征來代替。
[0124]此外,本領域的技術人員能夠理解,盡管在此所述的一些實施例包括其它實施例中所包括的某些特征而不是其它特征,但是不同實施例的特征的組合意味著處于本發明的范圍之內并且形成不同的實施例。例如,在權利要求書中,所要求保護的實施例的任意之一都可以以任意的組合方式來使用。
[0125]本發明的各個部件實施例可以以硬件實現,或者以在一個或者多個處理器上運行的軟件模塊實現,或者以它們的組合實現。本領域的技術人員應當理解,可以在實踐中使用微處理器或者數字信號處理器(DSP)來實現根據本發明實施例的訪問數據庫的裝置中的一些或者全部部件的一些或者全部功能。本發明還可以實現為用于執行這里所描述的方法的一部分或者全部的設備或者裝置程序(例如,計算機程序和計算機程序產品)。這樣的實現本發明的程序可以存儲在計算機可讀介質上,或者可以具有一個或者多個信號的形式。這樣的信號可以從因特網網站上下載得到,或者在載體信號上提供,或者以任何其他形式提供。
[0126]應該注意的是上述實施例對本發明進行說明而不是對本發明進行限制,并且本領域技術人員在不脫離所附權利要求的范圍的情況下可設計出替換實施例。在權利要求中,不應將位于括號之間的任何參考符號構造成對權利要求的限制。單詞“包含”不排除存在未列在權利要求中的元件或步驟。位于元件之前的單詞“一”或“一個”不排除存在多個這樣的元件。本發明可以借助于包括有若干不同元件的硬件以及借助于適當編程的計算機來實現。在列舉了若干裝置的單元權利要求中,這些裝置中的若干個可以是通過同一個硬件項來具體體現。單詞第一、第二、以及第三等的使用不表示任何順序。可將這些單詞解釋為名稱。
[0127]至此,本領域技術人員應認識到,雖然本文已詳盡示出和描述了本發明的多個示例性實施例,但是,在不脫離本發明精神和范圍的情況下,仍可根據本發明公開的內容直接確定或推導出符合本發明原理的許多其他變型或修改。因此,本發明的范圍應被理解和認定為覆蓋了所有這些其他變型或修改。
[0128]本發明實施例的一方面公開了Al、一種訪問數據庫的方法,包括:
[0129]接收來自客戶端的訪問數據庫的請求;
[0130]對所述請求進行類型分析,以確定所述請求是否為數據寫入請求;以及
[0131 ]當所述請求為數據寫入請求時,將所述請求相應的寫入操作記錄至本地日志,并將所述請求相應的數據寫入所述數據庫的緩存層。
[0132]A2、根據Al所述的方法,其中,還包括:
[0133]當所述請求為數據的讀取請求時,在所述緩存層中查找所述請求相應的數據,并將查找到的所述數據返回給所述客戶端。
[0134]A3、根據Al或A2所述的方法,其中,所述將所述請求相應的寫入操作記錄至本地日志,并將所述請求相應的數據寫入所述數據庫的緩存層的步驟進一步包括:
[0135]調用第一線程,并利用所述第一線程將所述請求相應的寫入操作記錄至所述本地日志并將所述請求相應的數據寫入所述緩存層。
[0136]A4、根據A1-A3中任一項所述的方法,其中,還包括:
[0137]調用第二線程并利用所述第二線程掃描所述本地日志以確定所述本地日志中是否存在日志增量,其中所述第二線程與所述第一線程異步;以及
[0138]若發現所述本地日志中存在日志增量,則將所述日志增量相應的數據寫入所述數據庫中。
[0139]A5、根據A1-A4中任一項所述的方法,其中,所述利用所述第二線程掃描所述本地日志以確定所述本地日志中是否存在日志增量的步驟進一步包括:
[0140]利用所述第二線程掃描所述本地日志,確定所述本地日志中是否存在未被標記的日志記錄;以及
[0141 ]若是,則確定所述未被標記的日志記錄為所述日志增量。
[0142]A6、根據A1-A5中任一項所述的方法,其中,所述將所述日志增量相應的數據寫入所述數據庫中之后,所述方法還包括:
[0143]在所述本地日志中對所述日志增量相應的日志記錄進行標記。
[0144]A7、根據A1-A6中任一項所述的方法,其中,還包括:
[0145]刪除所述本地日志中已被標記的日志記錄。
[0146]A8、根據A1-A7中任一項所述的方法,其中,還包括:
[0147]在所述數據庫出現故障重新啟動后,掃描所述本地日志,確定所述本地日志中是否存在未被標記的日志記錄;以及
[0148]若是,則將所述未被標記的日志記錄相應的數據寫入所述數據庫,并在所述本地日志中對所述未被標記的日志記錄進行標記。
[0149]A9、根據A1-A8中任一項所述的方法,其中,還包括:
[0150]當所述請求為數據的讀取請求時,若在所述緩存層中未查找到所述請求相應的數據,則將所述請求轉發至所述數據庫;以及
[0151]在所述數據庫中查找所述請求相應的數據,將查找到的所述請求相應的數據返回給所述客戶端,并在所述緩存層中緩存所述請求相應的數據。
[0152]A10、根據A1-A9中任一項所述的方法,其中,所述緩存層為分布式的高速緩存系統memcachedο
[0153]本發明實施例的另一方面還公開了B11、一種訪問數據庫的裝置,包括:
[0154]請求接收模塊,適于接收來自客戶端的訪問數據庫的請求;
[0155]請求分析模塊,適于對所述請求進行類型分析,以確定所述請求是否為數據寫入請求;以及
[0156]第一寫入模塊,適于當所述請求分析模塊確定所述請求為數據的寫入請求時,將所述請求相應的寫入操作記錄至本地日志,并將所述請求相應的數據寫入所述數據庫的緩存層。
[0157]B12、根據Bll所述的裝置,其中,還包括:
[0158]讀取模塊,適于當所述請求分析模塊確定所述請求為數據的讀取請求時,在所述緩存層中查找所述請求相應的數據,并將查找到的所述數據返回給所述客戶端。
[0159]B13、根據Bll或B12所述的裝置,其中,所述第一寫入模塊還適于:
[0160]調用第一線程,并利用所述第一線程將所述請求相應的寫入操作記錄至所述本地日志并將所述請求相應的數據寫入所述緩存層。
[0161]B14、根據B11-B13中任一項所述的裝置,其中,還包括:
[0162]第二寫入模塊,適于調用第二線程并利用所述第二線程掃描所述本地日志以確定所述本地日志中是否存在日志增量,其中所述第二線程與所述第一線程異步;以及若發現所述本地日志中存在日志增量,則將所述日志增量相應的數據寫入所述數據庫中。
[0163]B15、根據B11-B14中任一項所述的裝置,其中,所述第二寫入模塊還適于:
[0164]利用所述第二線程掃描所述本地日志,確定所述本地日志中是否存在未被標記的日志記錄;以及
[0165]若是,則確定所述未被標記的日志記錄為所述日志增量。
[0166]B16、根據B11-B15中任一項所述的裝置,其中,還包括:
[0167]標記模塊,適于在所述第二寫入模塊將所述日志增量相應的數據寫入所述數據庫中之后,在所述本地日志中對所述日志增量相應的日志記錄進行標記。
[0168]B17、根據B11-B16中任一項所述的裝置,其中,還包括:
[0169]刪除模塊,適于刪除所述本地日志中已被標記的日志記錄。
[0170]B18、根據B11-B17中任一項所述的裝置,其中,還包括:
[0171]故障處理模塊,適于在所述數據庫出現故障重新啟動后,掃描所述本地日志,確定所述本地日志中是否存在未被標記的日志記錄;以及
[0172]若是,則將所述未被標記的日志記錄相應的數據寫入所述數據庫,并在所述本地日志中對所述未被標記的日志記錄進行標記。
[0173]B19、根據B11-B18中任一項所述的裝置,其中,所述讀取模塊還適于:
[0174]當所述請求分析模塊確定所述請求為數據的讀取請求時,若在所述緩存層中未查找到所述請求相應的數據,則將所述請求轉發至所述數據庫;以及
[0175]在所述數據庫中查找所述請求相應的數據,將查找到的所述請求相應的數據返回給所述客戶端,并在所述緩存層中緩存所述請求相應的數據。
[0176]B20、根據B11-B19中任一項所述的裝置,其中,所述緩存層為分布式的高速緩存系統memcachedο
【主權項】
1.一種訪問數據庫的方法,包括: 接收來自客戶端的訪問數據庫的請求; 對所述請求進行類型分析,以確定所述請求是否為數據寫入請求;以及 當所述請求為數據寫入請求時,將所述請求相應的寫入操作記錄至本地日志,并將所述請求相應的數據寫入所述數據庫的緩存層。2.根據權利要求1所述的方法,其中,還包括: 當所述請求為數據的讀取請求時,在所述緩存層中查找所述請求相應的數據,并將查找到的所述數據返回給所述客戶端。3.根據權利要求1或2所述的方法,其中,所述將所述請求相應的寫入操作記錄至本地日志,并將所述請求相應的數據寫入所述數據庫的緩存層的步驟進一步包括: 調用第一線程,并利用所述第一線程將所述請求相應的寫入操作記錄至所述本地日志并將所述請求相應的數據寫入所述緩存層。4.根據權利要求1-3中任一項所述的方法,其中,還包括: 調用第二線程并利用所述第二線程掃描所述本地日志以確定所述本地日志中是否存在日志增量,其中所述第二線程與所述第一線程異步;以及 若發現所述本地日志中存在日志增量,則將所述日志增量相應的數據寫入所述數據庫中。5.根據權利要求1-4中任一項所述的方法,其中,所述利用所述第二線程掃描所述本地日志以確定所述本地日志中是否存在日志增量的步驟進一步包括: 利用所述第二線程掃描所述本地日志,確定所述本地日志中是否存在未被標記的日志記錄;以及 若是,則確定所述未被標記的日志記錄為所述日志增量。6.根據權利要求1-5中任一項所述的方法,其中,所述將所述日志增量相應的數據寫入所述數據庫中之后,所述方法還包括: 在所述本地日志中對所述日志增量相應的日志記錄進行標記。7.根據權利要求1-6中任一項所述的方法,其中,還包括: 刪除所述本地日志中已被標記的日志記錄。8.根據權利要求1-7中任一項所述的方法,其中,還包括: 在所述數據庫出現故障重新啟動后,掃描所述本地日志,確定所述本地日志中是否存在未被標記的日志記錄;以及 若是,則將所述未被標記的日志記錄相應的數據寫入所述數據庫,并在所述本地日志中對所述未被標記的日志記錄進行標記。9.根據權利要求1-8中任一項所述的方法,其中,還包括: 當所述請求為數據的讀取請求時,若在所述緩存層中未查找到所述請求相應的數據,則將所述請求轉發至所述數據庫;以及 在所述數據庫中查找所述請求相應的數據,將查找到的所述請求相應的數據返回給所述客戶端,并在所述緩存層中緩存所述請求相應的數據。10.—種訪問數據庫的裝置,包括: 請求接收模塊,適于接收來自客戶端的訪問數據庫的請求; 請求分析模塊,適于對所述請求進行類型分析,以確定所述請求是否為數據寫入請求;以及 第一寫入模塊,適于當所述請求分析模塊確定所述請求為數據的寫入請求時,將所述請求相應的寫入操作記錄至本地日志,并將所述請求相應的數據寫入所述數據庫的緩存層。
【文檔編號】G06F17/30GK106021335SQ201610299223
【公開日】2016年10月12日
【申請日】2016年5月6日
【發明人】宋昭
【申請人】北京奇虎科技有限公司, 奇智軟件(北京)有限公司