亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

用 GoLang 編寫可靠的數據存儲

用 GoLang 編寫可靠的數據存儲

Go
慕容3067478 2021-07-30 15:01:08
我一直在構建一個簡單的數據存儲,作為我將要為教育目的構建的文檔數據庫系統模塊的一部分。為了可靠地存儲數據,我必須遵守 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

}


查看完整回答
反對 回復 2021-08-02
  • 1 回答
  • 0 關注
  • 203 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號