緣起
數據存儲實在太重要,打算整理下有關數據存儲的相關內容。
內存篇
定長數據存儲
1、定長無序;
2、定長有序:1)數據本身有序;2)索引+無序數據。常見數據結構:數組、鏈表、樹、B+樹等。
增強約束:內存有序存放(新數據追加寫/循環寫;老數據直接覆蓋)。有序存放數據的內存數據可直接寫出到持久化設備,如磁盤、SSD等。
不定長數據
1、有序索引+內存無序存放(new、malloc);
2、有序索引+內存有序存放(預分配空間)。
3、有序索引+內存有序存放+緊湊追加寫(更新索引:更新或增加;廢棄標識:刪除)
常見的空間預分配策略:
1、數組、多階定長空間(指數、非指數);
2、定長數組+鏈表;
3、多階hash(同hash下是否允許存放多個key的數據?影響數據查找結束判斷)
空間擴展和數據遷移
對於多階定長空間分配,數據可不斷向高一階的空間遷移。當記錄不斷增加,需要限制對高階空間的長度。不斷擴展高階空間塊,可解決數據存儲問題,若考慮內存的使用率,還應該考慮如何決定最高階空間長度、是否增加多個低階空間塊。
緊湊存儲
對每一條內存中的數據記錄,要實現緊湊存儲的關鍵:可識別的數據記錄邊界。常見方法:1)記錄長度;2)使用唯一的記錄終止符(比如文本文件的'\n')。
使用場景的特殊限制:數據量基本不變;只讀;可丟數據;定期更新等。以上限制可簡化存儲設計。
問題:
實現細節:
1)如何保證記錄的原子更新?
2)如何保證更新期間的數據有效性?讀寫高效性?如何實現多讀多寫?一寫多讀?
系統通用性:
1) 如何保證數據安全 -- 持久化; 額外問題:故障恢復
2) 如何保證系統的平行擴展 -- 多機存儲 -> 引發問題:數據如何分布
3) 如何保證數據可用性 -- 存儲多份數據 -> 引發問題:數據的一致性