每一種數據存儲系統,對應有一種存儲模型,或者叫存儲引擎。咱們今天要介紹的是三種比較流行的存儲模型,分別是:redis
一、Hash存儲模型數據庫
二、B-Tree存儲模型緩存
三、LSM樹存儲模型異步
Hash存儲模型其實就是HashMap(哈希表)的持久化實現。這種模型的特色是與HashMap有密切關係的。咱們知道HashMap能夠支持:put(key)增長/修改、delete(key)刪除、get(key)隨機獲取操做,可是HashMap不支持get(1)這樣的操做。由於HashMap是無序的,不支持順序掃描。針對put、get操做,它的時間複雜度是O(1),也就是說讀寫速度都很快,因此針對單個Key的操做是很是快速的。若是咱們在應用中無需遍歷數據,Hash引擎是很是合適的。學習
首先,經過key,找到對應的文件編號。這個檢索的過程,是經過HashMap來實現的。線程
其次,經過文件編號找到存儲中的文件日誌
再者,經過value長度和位置找到對應的行數據blog
最後,讀取出value內容索引
B-Tree存儲模型因爲是樹狀結構存儲,因此,它是不支持隨機讀寫的。就像咱們學習二叉樹時,查找數據得經過遍歷樹的方式來查找數據。內存
上圖是一種典型的B-Tree存儲索引。葉子節點保存了每行的完整數據,非葉子節點保存了索引信息。數據在每一個節點都是有序存儲的,但查詢數據的時候,須要從根節點遍歷,而後根據二分查找直到找到葉子節點。若是數據再也不內存中,須要從磁盤中讀取,並加載到緩存。B+樹的根節點是常駐內存的,最多須要h-1次磁盤IO,複雜度爲O(h) = O(logdN)。修改操做首先要記錄提交日誌,而後在修改內存中的B+樹。
LSM樹的思想很容易理解,就是將數據的新增、修改增量數據先保存在內存中,到達指定的大小限制後將修改操做批量寫入到磁盤。讀取時,須要合併磁盤中的歷史數據和內存中最近的修改操做。LSM的優點在於有效地隨機寫入問題,但讀取可能須要訪問較多的磁盤文件。