我一直在構(gòu)建一個(gè)簡單的數(shù)據(jù)存儲(chǔ),作為我將要為教育目的構(gòu)建的文檔數(shù)據(jù)庫系統(tǒng)模塊的一部分。為了可靠地存儲(chǔ)數(shù)據(jù),我必須遵守 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}首先將數(shù)據(jù)(以 []byte 表示)保存到一個(gè)臨時(shí)文件中。然后與該文件同步file.Sync()以確保將數(shù)據(jù)寫入持久存儲(chǔ)。然后臨時(shí)文件被重命名為新文件。注意:我選擇的存儲(chǔ)數(shù)據(jù)文件的方式是 spoolDir 格式。這意味著從數(shù)據(jù)生成的散列的前兩個(gè)字符用作父目錄名稱。哈希的以下兩個(gè)字符用作后續(xù)目錄名稱。文件名將是剩下的 36 個(gè)字符。臨時(shí)文件只有一個(gè).tmp與文件路徑和文件名相同的后綴。這種設(shè)計(jì)的靈感來自于如何git存儲(chǔ)數(shù)據(jù)。問題:我實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)算法的方式是否足以確保數(shù)據(jù)可靠地持久化。
1 回答

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