Hash存儲模型、B-Tree存儲模型、LSM存儲模型介紹

每一種數據存儲系統,對應有一種存儲模型,或者叫存儲引擎。咱們今天要介紹的是三種比較流行的存儲模型,分別是:redis

  1. Hash存儲模型
  2. B-Tree存儲模型
  3. LSM存儲模型

不一樣存儲模型的應用狀況

一、Hash存儲模型數據庫

  • redis
  • memcache

二、B-Tree存儲模型緩存

  • MySQL(以及大多數的關係型數據庫)
  • MongoDB

三、LSM樹存儲模型異步

  • HBase
  • RocksDB

不一樣存儲模型介紹

一、Hash存儲模型

Hash存儲模型其實就是HashMap(哈希表)的持久化實現。這種模型的特色是與HashMap有密切關係的。咱們知道HashMap能夠支持:put(key)增長/修改、delete(key)刪除、get(key)隨機獲取操做,可是HashMap不支持get(1)這樣的操做。由於HashMap是無序的,不支持順序掃描。針對put、get操做,它的時間複雜度是O(1),也就是說讀寫速度都很快,因此針對單個Key的操做是很是快速的。若是咱們在應用中無需遍歷數據,Hash引擎是很是合適的。學習

image

首先,經過key,找到對應的文件編號。這個檢索的過程,是經過HashMap來實現的。線程

其次,經過文件編號找到存儲中的文件日誌

再者,經過value長度和位置找到對應的行數據blog

最後,讀取出value內容索引


二、B-Tree存儲模型

B-Tree存儲模型因爲是樹狀結構存儲,因此,它是不支持隨機讀寫的。就像咱們學習二叉樹時,查找數據得經過遍歷樹的方式來查找數據。內存

image

上圖是一種典型的B-Tree存儲索引。葉子節點保存了每行的完整數據,非葉子節點保存了索引信息。數據在每一個節點都是有序存儲的,但查詢數據的時候,須要從根節點遍歷,而後根據二分查找直到找到葉子節點。若是數據再也不內存中,須要從磁盤中讀取,並加載到緩存。B+樹的根節點是常駐內存的,最多須要h-1次磁盤IO,複雜度爲O(h) = O(logdN)。修改操做首先要記錄提交日誌,而後在修改內存中的B+樹。

三、LSM樹存儲引擎

LSM樹的思想很容易理解,就是將數據的新增、修改增量數據先保存在內存中,到達指定的大小限制後將修改操做批量寫入到磁盤。讀取時,須要合併磁盤中的歷史數據和內存中最近的修改操做。LSM的優點在於有效地隨機寫入問題,但讀取可能須要訪問較多的磁盤文件。

image

  • Level 0 :日誌/內存
    • 先寫入預寫日誌,再寫內存
    • 寫入日誌是爲了保障可用性
  • Level 1:日誌/內存,當Level 0寫入達到閾值,經過異步方式將部分數據刷寫到硬盤上
  • Level 2:合併,因爲不斷刷寫會產生大量小文件,這樣不利於管理和查詢。須要在合適的時機啓動一個異步線程進行合併操做生成一個大文件
相關文章
相關標籤/搜索