我一直在構建一個簡單的數據存儲,作為我將要為教育目的構建的文檔數據庫系統模塊的一部分。為了可靠地存儲數據,我必須遵守 ACID 屬性。下面顯示的是我的保存方法。func (document Document) Save() (hash string, err error) { if err := os.MkdirAll(document.FileDirectory(), 0600); err != nil { return "", err } file, err := os.Create(document.TmpFile()) if err != nil { return "", err } file.Write(document.Data) if err := file.Sync(); err != nil { return "", err } file.Close() if err := os.Rename(document.TmpFile(), document.File()); err != nil { return "", err } return document.Hash(), nil}首先將數據(以 []byte 表示)保存到一個臨時文件中。然后與該文件同步file.Sync()以確保將數據寫入持久存儲。然后臨時文件被重命名為新文件。注意:我選擇的存儲數據文件的方式是 spoolDir 格式。這意味著從數據生成的散列的前兩個字符用作父目錄名稱。哈希的以下兩個字符用作后續目錄名稱。文件名將是剩下的 36 個字符。臨時文件只有一個.tmp與文件路徑和文件名相同的后綴。這種設計的靈感來自于如何git存儲數據。問題:我實現數據存儲算法的方式是否足以確保數據可靠地持久化。
1 回答

UYOU
TA貢獻1878條經驗 獲得超4個贊
您正在做的事情保證了操作系統和硬件所保證的持久性(這是您可以獲得的最好的結果)。
它也是原子的;不完整的寫入不會留下不完整的數據,即使 CPU 著火。
重命名失敗時,您可能希望刪除臨時文件:
if err := os.Rename(document.TmpFile(), document.File()); err != nil {
os.Remove(document.TmpFile()) // ignore errors
return "", err
}
- 1 回答
- 0 關注
- 203 瀏覽
添加回答
舉報
0/150
提交
取消