介質特性
由於內存的易失性,存儲於內存的數據需要持久化來保證數據的安全。除了存儲介質不同,本質上數據是可以在不同的存儲介質中互相拷貝。內存極好的隨機訪問特性。磁盤seek極慢,良好的順序讀寫性能;SSD極好的隨機讀性能,擦除次數上限;擦除再寫入;頁寫入,塊擦除(寫放大: 擦除512KB大約2ms)。
Linux中寫文件並無法保證文件的數據是連續的,若一定要保證磁盤空間的連續性,需要使用空間預分配fallocate。
數據持久化
當內存數據有序存放,可直接將內存數據導出到持久化設備中,如磁盤、SSD。對於非有序的內存數據,轉成某種可解釋的格式連續存放即可。
索引與數據
在<內存篇>中,為了保證數據有序,常使用數據索引+數據的存儲方式。對於索引數據有3種處理方式:1)只存數據:當使用數據時通過掃描數據恢復數據索引;2)獨立存儲索引和數據;3)將索引和數據存放在一起:一般將索引存放在數據后面(索引依賴於數據的位置)。
數據格式與數據
對於KV數據,可完全不考慮數據格式,由應用程序自行處理數據格式。對於數據格式有3種處理方式:1)由應用程序自行處理;2)采用人可讀的格式存儲,比如txt、json、XML;3)獨立存儲數據格式和數據,如MySQL、采用獨立的protocal buffer文件描述數據格式;4)將數據格式和數據存放在一起:一般將數據格式存放在數據之前(數據解釋依賴其格式)。
實現細節
1)如何保證持久化一定成功?fsync?
2)如何定義通用的數據存儲格式?