跳到內容
矢量大腦象徵著記憶

內存數據庫

什麼是內存數據庫管理系統?

內存數據庫(IMDB;也是主內存數據庫系統或MMDB)存儲在計算機的主內存(內存),並由內存數據庫管理系統進行管理。傳統數據庫存儲在磁盤驅動器上。
傳統的基於磁盤的數據庫在格式化時會考慮到在其上讀寫數據的面向塊的設備。當數據庫的一部分引用另一部分時,可能需要從磁盤讀取不同的塊。這在內存數據庫中不是問題,可以通過直接指針管理數據庫各部分之間的相互關係。內存中數據始終存在,因此沒有讀取延遲。將數據寫入磁盤必須以“原子”方式完成,即所有寫入都已註冊,或者沒有寫入。這通常需要日記或重複寫入。內存數據庫沒有這種要求,因此對內存的更改幾乎是即時的。

磁盤上的數據庫與。內存數據庫

磁盤上的數據庫

  • 所有數據都存儲在磁盤上,磁盤I / O需要在需要時將數據移入主存儲器。
  • 數據始終保存在磁盤上。
  • 傳統的數據結構(例如B樹)旨在將表和索引有效地存儲在磁盤上。
  • 支持非常廣泛的工作負載,例如OLTP,數據倉庫,混合工作負載等。

內存數據庫

  • 所有數據存儲在主存儲器中,無需執行磁盤I / O即可查詢或更新數據。
  • 數據是持久性還是易失性,取決於內存數據庫產品。
  • 專用數據結構和索引結構假定數據始終位於主存儲器中。
  • 針對高性能進行了優化。

在內存數據庫管理系統中如何訪問和更改數據?

RDM內存數據庫中的數據“準備就緒”。在磁盤塊中的數據可以被壓縮,加密,扁平化或編碼的情況下,內存中的數據採用直接可用的格式。它還具有獨立於磁盤阻塞問題的結構,允許直接從列到列,行到行或索引到行導航,從而允許通過分配內存塊和重新排列指針來實現更改。

內存數據如何在多個任務之間共享?

答案是雙重的:越來越快。對於熟悉RDM事務性文件服務器(TFS)(可用於在同一計算機,辦公室LAN或全球範圍內的用戶進程之間共享數據庫)的人員來說,該數據庫可以由TFS在內存中進行管理。這比TFS管理的磁盤數據庫快。

但是,在多個任務之間共享一個數據庫的最快方法是使用多個線程運行一個進程,其中每個任務都在自己的線程中運行。這種形式的應用程序在一台計算機上運行,並允許每個線程直接在本地堆存儲中訪問數據庫。它還避免了將未更改的數據庫對象讀取到本地緩存中的需求,因為可以直接從數據庫內存中查看原始對象。這是在多用戶模式下共享數據庫的非常快速的方法。

可以在內存中使用磁盤數據庫嗎?

使用RDM時,答案是“是!”。內存數據庫在打開時可以從磁盤加載,在關閉數據庫或請求“保存點”時也可以保存到磁盤。保存點是原子的,這意味著自上一個保存點以來對數據的所有更改都一起寫入磁盤,或沒有寫入。這使它們具有事務性,但與磁盤數據庫不在同一事務邊界上。

內存數據庫的優點和缺點是什麼?

內存數據庫根據定義,可以處理它們正在主內存中處理的數據。無需處理二級存儲,二級存儲的速度可能比訪問主存儲器中保存的數據慢幾個數量級。消除了訪問較慢的輔助存儲的需求,從而允許在內存數據庫中使用基於磁盤的數據庫不可行的算法。例如,基於磁盤的數據庫通常使用基於b樹的索引來限制定位行所需的磁盤訪問次數。內存數據庫可以使用 AVL樹 代替 樹 這減少了(或消除了)重複數據的需求,但增加了遍歷過程中訪問的行數。

無需二級存儲,可以在沒有任何二級存儲的系統中使用內存數據庫。
這使得在許多情況下都可以使用數據庫引擎。 嵌入式系統 無法支持傳統的基於磁盤的引擎。
通常,內存數據庫系統使用的內存類型不是持久性的。當應用程序關閉時,無論是乾淨還是意外關閉,存儲在內存數據庫中的數據都將丟失。某些應用程序域在運行之間不需要數據持久性,但其他應用程序域則可能需要。那些需要高度持久性的應用程序可能不適合使用內存數據庫。

內存數據庫將所有數據存儲在主存儲器中,這可能會嚴重限制可以存儲的數據量。大多數數據庫系統可以臨時分配用於存儲數據庫對象的內存,也可以分配大量內存用作存儲。無論哪種方式,可以存儲在內存數據庫中的數據量往往比基於磁盤的系統中存儲的數據量要小得多。

內存數據庫與將數據簡單存儲在共享內存段之間有什麼區別?

內存數據庫與將數據存儲在共享內存段之間的最大區別在於結構化的數據訪問方法。內存數據庫維護“”數據存儲引擎的屬性。 ACID屬性包括原子性,一致性,隔離性和耐久性。儘管內存數據庫可以基於非持久存儲放鬆持久性屬性,但它們通常支持其他屬性:

• 原子性 –將所有更改作為全有或全無操作提交給數據庫
• 一致性 –為所有用戶維護結構規則和關係
• 隔離 –其他用戶只有在提交更改後,其他用戶才能看到它們

在共享內存段之上實現此功能可能既耗時又容易出錯。
除了內存數據庫的事務屬性外,還有許多其他
開箱即用的優勢包括:
使用通用的定義明確的數據定義語言(SQL DDL語句)使用通用的定義明確的數據查詢語言(SQL DML語句)通過網絡通信協議遠程訪問數據
能夠以與平台無關的格式存儲數據
可用於通過CSV,XML,JSON等導入/導出的工具。能夠將內存中的數據持久保存到磁盤

如果某些內存停止工作,則內存數據庫可能會丟失數據:您該如何處理?

應用程序開發人員需要了解,使用內存數據庫時可能會發生數據丟失。有多種方法(例如持久性和復制)可用於緩解數據丟失的情況,但是仍然可能發生數據丟失。

堅持不懈
來馬 支持在內存中打開數據庫的兩種模式。
• 易揮發的 –首次打開時數據庫為空,關閉數據庫時將丟棄所有內容
• 執著的 –在打開時,數據庫將從輔助存儲中的內容填充,在關閉時將更改後的數據(插入,更新,刪除)寫出到輔助存儲中

如果使用持久內存模式打開數據庫,則關閉數據庫後,更改後的內容將自動寫入輔助存儲。此外,開發人員可以根據需要將更改持久保存到輔助存儲。使用
持久性可以將數據丟失限制為自上次持久性操作以來發生的情況。

複寫
許多數據庫系統支持將更改複製到另一個數據庫實例(或另一個數據庫系統)。使用複制允許從內存副本中丟失的數據從復制副本中恢復。

所有嵌入式數據庫也是內存數據庫嗎?

一個 嵌入式數據庫 可以定義為在應用程序中運行並且不需要安裝,配置或訪問其他進程的數據庫引擎。引擎管理的數據的存儲介質取決於實現。
最初,大多數數據庫引擎使用硬盤進行數據存儲,因為可用的內存量不會為有用的數據集提供足夠的數據量。隨著內存大小的增加,許多供應商開始增加內存功能。如今,許多嵌入式或傳統的數據庫引擎都對內存提供了一些支持。

Raima如何在RDM中實現內存數據庫系統?

Raima RDM數據庫引擎分為兩個組件:運行時引擎和存儲引擎。
運行時負責事務管理,規則執行,查詢處理以及維護對數據庫的本地未提交更改。只要運行時引擎需要數據庫對象,它就會從存儲引擎請求該對象。另外,在提交運行時中的本地更改後,會將它們提供給存儲引擎,以存儲在數據庫的所有用戶之間共享的位置中。運行時引擎不知道或不在乎存儲引擎是在使用主內存還是輔助存儲。

可以將存儲引擎視為 鍵/值對存儲庫。鍵是數據庫對象標識符,而值是數據庫對象的位置。對於基於磁盤的數據庫,該值將是文件標識符,文件偏移量和大小,對於內存數據庫,該值將是數據庫對象的存儲位置。
對象本身可以被編碼,壓縮和加密,但是運行時引擎將知道如何解釋內容。

通過維持這種抽象,應用程序開發人員無需執行其他任何操作,只需指定打開前配置參數即可使用內存中的RDM數據庫。應用程序,運行時和存儲引擎都可以在同一內存空間中運行,從而提供非常低的延遲訪問。如果開發人員知道數據庫將主要用於內存中,那麼他們可以使用諸如 AVL索引 優化內存訪問。

進一步了解 Raima的內存實現.

了解Raima如何提供 高性能的, 便攜的 嵌入式數據庫移動數據庫 解決方案。