儲存系統實現 構建自己的儲存系統 一

2021-08-27 12:18:19 字數 1122 閱讀 8115

一直在斷斷續續的看lucene原始碼,怎麼也理不清其中千絲萬縷的聯絡,遂想自己邊寫邊理解。在寫的過程中更加理解索引的意義,以及在開發過程中如何利用索引加快檢索,如何利用跳躍表來實現快速查詢。如何利用快取來實現減少磁碟io的開銷。

這裡先從整個流程說起,這裡簡單的模擬了一下資料儲存和查詢的過程。在寫這個的過程中基本可以深刻理解索引的真實意義。

儲存資料

1.在資料檔案中寫入資料,得到該資料的起始位置和結束位置,也就是兩個偏移量。目前我儲存這三個值每個物件也就20個位元組,即使5萬的索引資料也就1m,這樣的資料在記憶體中直接操作都沒有問題。

2.在索引檔案中生成乙個主鍵,然後把資料檔案中得到的兩個偏移量儲存到索引檔案中。

查詢資料(按主鍵id查詢)

1.在索引檔案中根據主鍵id查詢相應的偏移量。這裡如果是從頭開始遍歷性能還是比較差的。我在檔案中如果儲存了100萬的資料,如果獲取最後一條資料需要的時間是7~10秒,這樣的效能是不可接受的。因為整個儲存是順序儲存(按id自增),所以可能會想到二分查詢。我這裡使用了跳躍表的查詢方式。如果按照一般的步長的話讀第100萬條資料需要走100萬步,那麼如果用跳躍表的方式可以大大簡少讀取和資料的對比次數。優化後單執行緒的效能在100毫秒以內。效能還是相當不錯。後續會專門開闢一篇文章來講我的實現方式。

2.根據這個偏移量去資料檔案去查詢相應的資料。

問題

1.我這裡是直接儲存資料的偏移量來直接定位資料,這樣會有乙個非常嚴重的問題,就是在資料更新的時候會破壞整個資料的偏移量,所以看似這種用儲存偏移量可以極快的加快檢索速度,但是如果有插入和更新操作中效能損失是致命的,這意味著需要更新整個儲存的偏移量。目前還在探索中,還沒有想到乙個比較好的解決辦法來解決!

2.快取的使用,因為不管是讀還是寫檔案的過程中都是需要加鎖的。所以在併發的過程中會導致鎖等待,這樣效能會有比較大的損失。我這裡使用了記憶體快取快取一些熱點資料,命中率比較高的情況下效能還是有比較大的提公升,由於整個記憶體比較有限,所以希望最大限度的快取索引,以達到減少io開銷的目的。如果是隨機訪問的話效能會比較差,所以如何提高隨機訪問的效能也是我後續需要思考的問題。

總結

通過寫這個儲存,可以學習一些比較底層的知識。後續不斷完善中。

儲存系統(1) 儲存系統的層次結構

目的 為了解決計算機容量,速度之間的關係 2.層次 1 邏輯上分為以下層次 cpu 通用暫存器 cache 主存 輔存 2 主要層次 cache 提高訪問速度 虛擬儲存器 提高儲存器容量 3.原則 1 包含性原則 上層儲存器儲存內容為下層儲存器一部分內容的副本。比如cache內容為主存某一部分內容的...

儲存系統 儲存技術(1)

主機匯流排介面卡 host bus adapter hba 處理從伺服器到儲存裝置的連線,也可以執行其他幾個角色。而乙個基本的hba提供連線到儲存,更先進的hba已經嵌入陣列控制器。當儲存在位於或連線到伺服器,它被稱為直接附加儲存 direct attached storage das 通過專用的外...

儲存系統(4) 虛擬儲存

1.目的 將一部分磁碟空間作為主存,容量接近輔存,速度接近主存。2.工作原理 cpu給出虛擬位址,進行內部轉換,判斷改位址是否在主存中 若在,從主存中提取資料 若不在,進行外部位址轉換 利用外頁表,外段表,通常由軟體實現 外部轉換計算出輔存位址,並使用替換演算法,進行資料的調入調出 備註 cpu通過...