檔案資料庫之sqlite 與記憶體資料庫 redis
記憶體資料庫:大資料時代資料管理新寵
在 2012中國系統架構師大會上,筆者曾做過一份有關大資料的調查,其中一項“在眾多的技術趨勢中,您所關注的資料管理的新技術是什麼?”的調查結果中, “記憶體資料庫”成為僅次於“分散式儲存與計算”的最受關注的新技術。記憶體資料庫之所以受到越來越多的關注,與其效能上的飛躍和價效比的不斷提升有著密不可分的關係。
記憶體資料庫,顧名思義就是將資料放在記憶體中直接操作的資料庫。相對於磁碟,記憶體的資料讀寫速度要高出幾個數量級,將資料儲存在記憶體中相比從磁碟上訪問能夠極大地提高應用的效能。同時,記憶體資料庫拋棄了磁碟資料管理的傳統方式,基於全部資料都在記憶體中重新設計了體系結構,並且在資料快取、快速演算法、並行操作方面也進行了相應的改進,所以資料處理速度比傳統資料庫的資料處理速度要快很多,一般都在10倍以上。記憶體資料庫的最大特點是其“主拷貝”或“工作版本”常駐記憶體,即活動事務只與實時記憶體資料庫的記憶體拷貝打交道。
記憶體資料庫與傳統資料庫的異同
記憶體資料庫的目標是通過使用記憶體實現資料儲存來提高吞吐量和降低延遲。這與使用磁碟儲存的傳統資料庫管理系統不同,由於內部優化演算法更簡單,而且執行的CPU指令較少,所以記憶體內資料的速度比基於磁碟的資料庫快。訪問記憶體資料可以提高響應速度,對於一些響應時間要求較高的應用程式,如交易、電信和國防系統,一般都會使用記憶體資料庫。由於記憶體資料庫的這種特性,這些資料庫使用記憶體要多於磁碟資料庫產品。具體差別如下:
1. 傳統的資料庫系統是關係型資料庫,開發這種資料庫的目的,是處理永久、穩定的資料。關係資料庫強調維護資料的完整性、一致性,但很難顧及有關資料及其處理的定時限制,不能滿足工業生產管理實時應用的需要,因為實時事務要求系統能較準確地預報事務的執行時間。
2. 對磁碟資料庫而言,由於磁碟存取、內外存的資料傳遞、緩衝區管理、排隊等待及鎖的延遲等使得事務實際平均執行時間與估算的最壞情況執行時間相差很大,如果將整個資料庫或其主要的“工作”部分放入記憶體,使每個事務在執行過程中沒有I/O,則為系統較準確估算和安排事務的執行時間,使之具有較好的動態可預報性提供了有力的支援,同時也為實現事務的定時限制打下了基礎。這就是記憶體資料庫出現的主要原因。
3. 記憶體資料庫所處理的資料通常是“短暫”的,即有一定的有效時間,過時則有新的資料產生,而當前的決策推導變成無效。所以,實際應用中採用記憶體資料庫來處理實時性強的業務邏輯處理資料。而傳統資料庫旨在處理永久、穩定的資料,其效能目標是高的系統吞吐量和低的代價,處理資料的實時性就要考慮的相對少一些。實際應用中利用傳統資料庫這一特性存放相對實時性要求不高的資料。
在實際應用中這兩種資料庫常常結合使用,而不是以記憶體資料庫替代傳統資料庫。
·SQLite
SQLite是一款輕型的資料庫,它佔用資源非常的低,同時能夠跟很多程式語言相結合,但是支援的SQL語句不會遜色於其他開源資料庫。它的設計目標是嵌入式的,而且目前已經在很多嵌入式產品中使用了它,它佔用資源非常的低,在嵌入式裝置中,可能只需要幾百K的記憶體就夠了。它能夠支援Windows/Linux/Unix等等主流的作業系統,同時能夠跟很多程式語言相結合,比如Tcl、PHP、Java 等,還有ODBC介面,同樣比起Mysql、PostgreSQL這兩款開源世界著名的資料庫管理系統來講,它的處理速度比他們都快。
·Redis
Redis是一款開源的、高效能的鍵-值儲存 (key-value store)。它常被稱作是一款資料結構伺服器(data structure server)。Redis的鍵值可以包括字串(strings)、雜湊(hashes)、列表(lists)、集合(sets)和 有序集合(sorted sets)等資料型別。 對於這些資料型別,你可以執行原子操作。例如:對字串進行附加操作(append);遞增雜湊中的值;向列表中增加元素;計算集合的交集、並集與差集等。