在 BoltDB 中存储数据的最佳方式

Posted

技术标签:

【中文标题】在 BoltDB 中存储数据的最佳方式【英文标题】:Best way to store data in BoltDB 【发布时间】:2016-07-19 06:56:06 【问题描述】:

我是 BoltDB 和 Golang 的新手,正在寻求您的帮助。

所以,我知道我只能为 BoltDB 的键和值保存字节数组 ([]byte)。如果我有一个如下的用户结构,并且键是用户名,那么将数据存储到需要字节数组的 BoltDB 中的最佳选择是什么?

序列化它还是 JSON?还是更好的方法?

type User struct 
    name string
    age  int
    location string
    password string
    address string 

非常感谢,祝你晚安

【问题讨论】:

Good BoltDB example using json or gob encoding 【参考方案1】:

是的,我建议将 User 结构编组为 JSON,然后使用唯一键 []byte 切片。不要忘记,编组为 JSON 仅包括导出的结构字段,因此您需要更改结构,如下所示。

另一个例子,见BoltDB GitHub page。

type User struct 
    Name string
    Age  int
    Location string
    Password string
    Address string 


func (user *User) save(db *bolt.DB) error 
    // Store the user model in the user bucket using the username as the key.
    err := db.Update(func(tx *bolt.Tx) error 
        b, err := tx.CreateBucketIfNotExists(usersBucket)
        if err != nil 
            return err
            

        encoded, err := json.Marshal(user)
        if err != nil 
            return err
        
        return b.Put([]byte(user.Name), encoded)
    )
    return err

【讨论】:

感谢您的帮助!很有帮助! 您可能还想研究其他序列化格式,例如 Protocol Buffers,它可以显着加快编组/解组并提供版本控制等功能。【参考方案2】:

Storm 包是一个不错的选择,它可以完全满足您的需求:

package main

import (
   "fmt"
   "github.com/asdine/storm/v3"
)

type user struct 
   ID int `storm:"increment"`
   address string
   age int


func main() 
   db, e := storm.Open("storm.db")
   if e != nil 
      panic(e)
   
   defer db.Close()
   u := useraddress: "123 Main St", age: 18
   db.Save(&u)
   fmt.Printf("%+v\n", u) // ID:1 address:123 Main St age:18

如您所见,您不必担心编组,它会为您处理。默认情况下它使用 JSON,但您也可以将其配置为使用 GOB 或其他:

https://github.com/asdine/storm

【讨论】:

以上是关于在 BoltDB 中存储数据的最佳方式的主要内容,如果未能解决你的问题,请参考以下文章

存储引擎 boltdb 的设计奥秘?

Go语言中使用 BoltDB数据库

Go语言中使用 BoltDB数据库

Golang区块链开发003区块序列化存储

在 Redshift 中存储事件数据的最佳方式是啥?

在数据库中存储货币价值的最佳方式是啥?