我一直在构建一个简单的数据存储,作为我将要为教育目的构建的文档数据库系统模块的一部分。为了可靠地存储数据,我必须遵守 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 关注
- 184 浏览
添加回答
举报
0/150
提交
取消