最近一段時間研究了內存數據庫,總結了一下,分享給你們。咱們先從應用場景提及。html
一. 內存數據庫的應用場景git
二. 業界有哪幾類主流的內存數據庫github
1. 關係型內存數據庫redis
2. 鍵值對內存數據庫算法
3. 傳統數據庫的內存數據庫引擎數據庫
還有Oracle 的Timesten、SAP的HANA等,這些商業中間件不在咱們研究的範圍以內。緩存
那麼,傳統數據庫和內存數據庫之間是什麼關係? 相互補充、珠聯璧合的關係服務器
內存數據庫不會獨立於傳統數據庫而單獨存在,由於內存是易失的。如今具備持久化功能的內存庫,如redis、couchbase等,其持久化功能相較傳統數據庫還較溥弱,持久化性能也不如傳統數據庫。所以,內存數據庫在一段時期內,將是傳統數據庫的一種強有力的補充。數據結構
若是說傳統數據庫是一支軍隊,那麼內存數據庫就是爲執行某種特殊任務的特種部隊,不要求功能多,但必定要快速、迅猛。架構
咱們繼續一一對比分析一下上面所述的幾類內存數據庫。
三. 業界主流的內存數據庫
1. SQL Server 2016 In-Memory OLTP
SQL Server 2016的In-Memory OLTP,通俗地講,是內存數據庫,使用內存優化表(Memory-Optimized Table,簡稱MOT)來實現,MOT駐留在內存中,使用 Hekaton 內存數據庫引擎訪問。在查詢MOT時,只從內存中讀取數據行,不會產生Disk IO消耗;在更新MOT時,數據的更新直接寫入到內存中。內存優化表可以在Disk上維護一個數據副本,該副本只用於持久化數據,不用於數據讀寫操做。
在內存數據庫中,不是全部的數據都須要存儲在內存中,有些數據仍然可以存儲在Disk上,硬盤表(Disk-Based Table,簡稱DBT)是傳統的表存儲結構,每一個Page是8KB,在查詢和更新DBT時,產生Disk IO操做,將數據從Disk讀取到內存,或者將數據更新異步寫入到Disk中。
內存數據庫將本來存儲在Disk上的數據,存儲在內存中,利用內存的高速訪問優點實現數據的快速查詢和更新,可是,內存數據庫,不只僅是存儲空間的變化,Hekaton 內存數據庫訪問引擎實現本地編譯模塊(Natively compiled),交叉事務(Cross-Container Transaction)和查詢互操做(Query Interop):
本地編譯模塊:若是代碼模塊只訪問MOT,那麼能夠將該模塊定義爲本地編譯模塊,SQL Server直接將TSQL腳本編譯成機器代碼;SQL Server 2016支持本地編譯的模式有:存儲過程(SP),觸發器(Trigger),標量值函數(Scalar Function)或內嵌多語句函數(Inline Multi-Statement Function)。相比於解釋性(Interpreted)TSQL 模塊,機器代碼直接使用內存地址,性能更高。
交叉事務:在解釋性TSQL模塊中,一個事務既能訪問硬盤表,也能訪問內存優化表;實際上,SQL Server建立了兩個事務,一個事務用於訪問硬盤表,一個事務用於訪問內存優化表,在DMV中,分別使用transaction_id 和 xtp_transaction_id 來標識。
查詢互操做:解釋性TSQL腳本可以訪問內存優化表和硬盤表,本地編譯模塊只能訪問內存優化表。
內存數據被整合到SQL Server關係引擎中,使用內存數據庫時,客戶端應用程序甚至感覺不到任何變化,DAL接口也不須要作任何修改。因爲Query Interop的存在,任何解釋性TSQL腳本都能透明地訪問MOT,只是性能沒有本地編譯TSQL腳本性能高。在使用分佈式事務訪問MOT時,必須設置合適的事務隔離級別,推薦使用Read Committed,若是發生MSSQLSERVER_41333 錯誤,說明產生交叉事務隔離錯誤(CROSS_CONTAINER_ISOLATION_FAILURE),緣由是當前事務的隔離級別過高。
2. Apache Ignite
Apache Ignite是一個內存數據組織是高性能的、集成化的以及分佈式的內存平臺,他能夠實時地在大數據集中執行事務和計算,和傳統的基於磁盤或者閃存的技術相比,性能有數量級的提高。
能夠將Ignite視爲一個獨立的、易於集成的內存組件的集合,目的是改進應用程序的性能和可擴展性。
Data Grid:Ignite內存數據網格是一個內存內的鍵值存儲,他能夠在分佈式集羣的內存內緩存數據。 它經過強語義的數據位置和關係數據路由,來下降冗餘數據的噪聲,使其能夠節點數的線性增加,直至幾百個節點。 Ignite數據網格速度足夠快,通過官方不斷的測試,目前,他是分佈式集羣中支持事務性或原子性數據的最快的實現之一。
SQL Grid:內存SQL網格爲Apache Ignite提供了分佈式內存數據庫的功能,它水平可擴展,容錯而且兼容SQL的ANSI-99標準。 SQL網格支持完整的DML命令,包括SELECT, UPDATE, INSERT, MERGE以及DELETE。 同時支持分佈式SQL Join關聯
RDBMS集成: Ignite支持與各類持久化存儲的集成,它能夠鏈接數據庫,導入模式,配置索引類型,以及自動生成全部必要的XML OR映射配置和Java領域模型POJO,這些均可以輕易地下載和複製進本身的工程。 Ignite能夠與任何支持JDBC驅動的關係數據庫集成,包括Oracle、PostgreSQL、MS SQL Server和MySQL。
彙總一下,Apache Ignite的功能特性:
從以上的Apache Ignite的特性看,它就是一個關係型的內存數據庫。貌似在這個領域,Apache Ignite作的很是好。這一點很是符合咱們技術選型的須要!一句話:
能夠像操做數據庫同樣,操做內存緩存!
3. FastDB
FastDb是高效的關係型內存數據庫系統,具有實時能力及便利的C++接口。FastDB針對應用程序經過控制讀訪問模式做了優化。經過下降數據傳輸的開銷和很是有效的鎖機制提供了高速的查詢。對每個使用數據庫的應用數據庫文件被影射到虛擬內存空間中。所以查詢在應用的上下文中執行而不須要切換上下文以及數據傳輸。Fastdb中併發訪問數據庫的同步機制經過原子指令實現,幾乎不增長查詢的開銷。
FastDB的特色:
缺點:
4. Redis&Memcached
Redis和Memcached,從本質上看,都屬於Key-Value內存數據庫,Redis不管從穩定性、性能和功能上都要強於MemCached。
NoSQL結構設計,不支持關係型數據結構。
Redis咱們已經大規模應用了,本次技術選型的重要在於關係型內存數據庫上,因此,Redis和MemCached不做深刻研究和討論。
初步的選型總結:
從需求和功能知足度上看:Apache Ignite 最知足咱們的需求,從Apache Ignite的特性看,它就是一個關係型的內存數據庫。貌似在這個領域,Apache Ignite作的很是好。這一點很是符合咱們技術選型的須要!一句話:
能夠像操做數據庫同樣,操做內存緩存!
先放出兩張圖給你們:
from:https://www.cnblogs.com/tianqing/p/7429900.html