猿问

BoltDB 中的关键顺序

boltdb 的键应该使用哪个字节序?我应该先获取机器的字节序并使用它吗?


我需要正确排序键 - 就像一个字节序列,没有用于排序它们的特定逻辑。例如,这里应该使用哪个字节序(theKey是一个连续的id,就像 amongodb的一个):


package main


import (

    "bytes"

    "encoding/binary"

    "fmt"

    "log"

    "time"


    "github.com/boltdb/bolt"

)


var (

    Endian = binary.BigEndian // Which endian?

)


func main() {

    db, err := bolt.Open("temp.db", 0600, nil)

    if err != nil {

        log.Fatal(err)

    }

    defer db.Close()

    defer time.Sleep(time.Second)


    tempBucket := []byte("TMP")


    db.Update(func(tx *bolt.Tx) error {

        data := Row{

            Key: Key{

                Head:    0x1A1A1A,

                Mark:    0x1010,

                Counter: 0x01,

            },

            At:      time.Now().UTC().Unix(),

            Payload: 10,

        }


        keyBytes, err := marshal(&data.Key)

        if err != nil {

            return erp(err)

        }


        dataBytes, err := marshal(&data)

        if err != nil {

            return erp(err)

        }


        b, err := tx.CreateBucketIfNotExists(tempBucket)

        if err != nil {

            return erp(err)

        }


        err = b.Put(keyBytes, dataBytes)

        if err != nil {

            return erp(err)

        }


        return nil

    })


    db.View(func(tx *bolt.Tx) error {

        b := tx.Bucket(tempBucket)


        c := b.Cursor()


        for k, v := c.First(); k != nil; k, v = c.Next() {

            k, v := k, v

            fmt.Println(k, v)


            dt := Row{}

            err := unmarshal(&dt, v)

            if err != nil {

                return erp(err)

            }

            fmt.Printf("key=%X, value=%v\n", k, dt)

        }


        return nil

    })

}


func erp(e error) error {

    log.Println(e)

    return e

}


func marshal(pointerToData interface{}) ([]byte, error) {

    buf := new(bytes.Buffer)

    err := binary.Write(buf, Endian, pointerToData)

    if err != nil {

        return nil, err

    }

    return buf.Bytes(), nil

}


阿波罗的战车
浏览 173回答 1
1回答

函数式编程

要自然排序密钥,请使用 BigEndian在 LittleEndian 中,字节被交换,这会让它乱序。
随时随地看视频慕课网APP

相关分类

Go
我要回答