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

        一直在斷斷續續的看Lucene源碼,怎麼也理不清其中千絲萬縷的聯繫,遂想自己邊寫邊理解。在寫的過程中更加理解索引的意義,以及在開發過程中如何利用索引加快檢索,如何利用跳躍表來實現快速查找。如何利用緩存來實現減少磁盤IO的開銷。

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

         存儲數據

1.      在數據文件中寫入數據,得到該數據的起始位置和結束位置,也就是兩個偏移量。目前我存儲這三個值每個對象也就20個字節,即使5萬的索引數據也就1M,這樣的數據在內存中直接操作都沒有問題。

2.      在索引文件中生成一個主鍵,然後把數據文件中得到的兩個偏移量存儲到索引文件中。

查詢數據(按主鍵ID查找)

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

2.      根據這個偏移量去數據文件去查找相應的數據。

問題

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

2.             緩存的使用,因爲不管是讀還是寫文件的過程中都是需要加鎖的。所以在併發的過程中會導致鎖等待,這樣性能會有比較大的損失。我這裏使用了內存緩存緩存一些熱點數據,命中率比較高的情況下性能還是有比較大的提升,由於整個內存比較有限,所以希望最大限度的緩存索引,以達到減少IO開銷的目的。如果是隨機訪問的話性能會比較差,所以如何提高隨機訪問的性能也是我後續需要思考的問題。

總結

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章