为了账号安全,请及时绑定邮箱和手机立即绑定

用 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 关注
  • 184 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信