5分钟快3首页    注册   登录
5分钟快3 = way to explore
5分钟快3 是一个5分钟快3关于 分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
beego
gamexg
5分钟快3  ›  Go

有什么 golang 下不依赖 cgo 的嵌入式 sql 数据库5分钟快3推荐 吗?

  •  1
     
  •   gamexg · 9 天前 · 1287 次点击

    如题,

    sqlite 依赖于 cgo,不太方便交叉编译。

    sqlite+dll 的方式只适合 5分钟快3Win dows,不适合 linux 。

    kv 数据库有不少,但是功能上不如 sql 数据库齐全。

    除此之外还有其他的选择吗?

    储存少量数据需求,几千行数据。

    15 条回复    2020-04-01 16:05:16 +08:00
    janxin
        1
    janxin   9 天前   ❤️ 1
    5分钟快3搜索 sqlite pure golang
    lniwn
        2
    lniwn   9 天前   ❤️ 1
    前些天从 sqlite 换到了 kv 数据库 bolt,目前没有发现不适。
    http://github.com/etcd-io/bbolt
    Trim21
        3
    Trim21   9 天前   ❤️ 1
    http://github.com/go-sqlite/sqlite3 “pure-Go sqlite3 file reader”
    wsy2220
        4
    wsy2220   9 天前 via Android   ❤️ 1
    sqlite 是交叉编译最容易的 c 库了……
    loading
        5
    loading   9 天前 via Android   ❤️ 1
    golang 的交叉编译太简单了,除非还有别的库。
    sqlite 真的香。
    gamexg
        6
    gamexg   9 天前
    @janxin #1 5分钟快3我 5分钟快3搜索 到的都是半成品,请问指的是?

    @lniwn #2 5分钟快3我 也是打算用 kv,不过有的地方需要自己实现索引有点麻烦,所以看看是否有更好的选择。

    @Trim21 #3 只读?

    @wsy2220 #4 但是维护各个平台下能够交叉编译到多环境挺麻烦。cgo 也碰到过多次奇怪的错误,想尽量避免 cgo 。

    @loading #5 目前比较方便的交叉编译方式是? xgo ?
    的确 sqlite 省心。
    gamexg
        7
    gamexg   9 天前
    @lniwn #2

    5分钟快3我 原来测试过 github.com/boltdb/bolt
    批量写入时,如果 key 不是顺序而是随机值,第一次写入速度会非常慢,100000 条需要 19s 。
    刚刚试了下,etcd 也存在这个问题。
    yrj
        8
    yrj   8 天前 via iPad
    楼主找到了也告诉5分钟快3我 一声,5分钟快3我 只找到了 sqlite
    lniwn
        9
    lniwn   8 天前
    @gamexg #7 方便把测试代码发出来看下吗?这种单文件数据库,每次 update 操作都是存盘的,用 batch 方式,或者手动事务应该不至于这么低的性能。
    gamexg
        10
    gamexg   8 天前
    @lniwn #9

    ```
    package main

    import (
    "encoding/binary"
    "fmt"
    "log"
    "math/rand"
    "os"
    "time"

    "go.etcd.io/bbolt"
    )

    func itob(v int) []byte {
    b := make([]byte, 8)
    binary.BigEndian.PutUint64(b, uint64(v))
    return b
    }

    func main() {
    test2()
    }

    // 测试随机批量连续
    func test2() {
    os.Remove("test2.db")
    db, err := bbolt.Open("test2.db", 0600, nil)
    if err != nil {
    log.Fatal(err)
    }
    defer db.Close()

    err = db.Update(func(tx *bbolt.Tx) error {
    _, err := tx.CreateBucketIfNotExists([]byte("MyBucket"))
    return err
    })
    if err != nil {
    panic(err)
    }

    buf := []byte("0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")

    data := make([]int, 100000)
    for i, _ := range data {
    data[i] = rand.Int()
    }

    for i := 0; i < 20; i++ {
    sTime := time.Now()
    err = db.Update(func(tx *bbolt.Tx) error {
    b := tx.Bucket([]byte("MyBucket"))
    for _, v := range data {
    err := b.Put(itob(v), buf)
    if err != nil {
    return err
    }
    }
    return nil
    })
    /*
    乱序批量写 100000:15.2067849s
    乱序批量写 100000:409.6209ms
    乱序批量写 100000:421.3134ms
    乱序批量写 100000:381.5371ms
    乱序批量写 100000:381.5839ms
    乱序批量写 100000:361.8394ms
    乱序批量写 100000:362.8142ms
    乱序批量写 100000:364.7673ms
    乱序批量写 100000:359.8283ms
    乱序批量写 100000:376.0383ms
    乱序批量写 100000:361.9876ms
    乱序批量写 100000:362.0323ms
    乱序批量写 100000:374.0311ms
    乱序批量写 100000:365.0348ms
    乱序批量写 100000:360.0383ms
    乱序批量写 100000:361.022ms
    乱序批量写 100000:364.0195ms
    乱序批量写 100000:354.024ms
    乱序批量写 100000:370.0098ms
    乱序批量写 100000:379.9845ms
    */
    fmt.Println("乱序批量写 100000:", time.Now().Sub(sTime))
    }
    }

    ```
    ysmood
        11
    ysmood   8 天前
    lniwn
        12
    lniwn   8 天前
    @gamexg #10 5分钟快3我 用 Begin/Commit 试了下,第一次也是耗时很久。
    bwangel
        13
    bwangel   4 天前
    楼主是否考虑带5分钟快3服务 端的嵌入式数据库?

    http://github.com/taosdata/TDengine

    http://github.com/rqlite/rqlite

    这两个的客户端都是纯 Go,就是需要额外启动一个5分钟快3服务 端,但5分钟快3服务 端的存储都是单文件,看起来没那么复杂。
    bwangel
        14
    bwangel   4 天前
    还有一个

    http://gitlab.com/cznic/ql

    看到 2020 年还在更新。
    monkeyWie
        15
    monkeyWie   2 天前
    5分钟快3推荐 两个 K/V 库
    http://github.com/xujiajun/nutsdb
    http://github.com/prologic/bitcask
    如果习惯写 sql 的话还是建议 sqlite,用 xgo 交叉编译就行了,参考: http://monkeywie.github.io/2019/10/10/go-cross-compile
    5分钟快3关于   ·   FAQ   ·   API   ·   5分钟快35分钟快3我 们 的愿景   ·   广告投放   ·   感谢   ·   实用小5分钟快3工具   ·   1123 人在线   最高记录 5168   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 20ms · UTC 19:18 · PVG 03:18 · LAX 12:18 · JFK 15:18
    ♥ Do have faith in what you're doing.