当前位置: 代码迷 >> 综合 >> 商业公链之区块链技术使用的常见库(三)------Go语言键值数据库 ”github.com/syndtr/goleveldb/leveldb”
  详细解决方案

商业公链之区块链技术使用的常见库(三)------Go语言键值数据库 ”github.com/syndtr/goleveldb/leveldb”

热度:90   发布时间:2023-12-10 18:09:16.0

levelDB是Google开源的KeyValue文件数据库,LevelDB是一个非常高效的kv数据库,1.2-version就能够支持billion级的数据量了,在这个数量级下还有着非常高的性能,主要归功于它的良好设计,特别是LSM算法.特点:

1.key和value都是任意长度的字节数组;

2.entry(即一条k-v记录)默认是按照key的字典顺序存储的,开发者开源重载这个排序函数;

3.提供了一些基本接口

4.支持批量操作以原子操作进行

5.开源创建数据全景的snapshot(快照),并允许在快照中查询

6.开源通过向前(后)迭代器遍历数据(迭代器隐含的创建一个snapshot)

7.自动使用Snappy压缩数据;

8.可移植性.

限制:

1.NoSQL,不支持sql语句,也不支持索引;

2.一次只允许一个进程访问一个特定的数据库;

3.没有内置的C/S架构,开发者需要使用LevelDB库自己封装一个server;

 

1.安装kv数据库leveldb:go get github.com/syndtr/goleveldb/leveldb

2.通过数据库路径创建或打开一个数据库,可选使用boom过滤器:db,err := leveldb.OpenFile("F:\\work\\testdb\\db", nil)

o := &opt.Options{

    Filter: filter.NewBloomFilter(10),

}

db, err := leveldb.OpenFile("F:\\work\\testdb\\db", o)

3.数据库存入键值数据:db.Put([]byte("2"), []byte("6"), nil)

4.遍历数据库内容,返回底层最新数据库快照的迭代器,可以设置返回不同快照:iter := db.NewIterator(nil, nil)

读取快照迭代器每一个键值:

for iter.Next() {

fmt.Printf("[%s]:%s\n", iter.Key(), iter.Value())

}

最后必须release释放和检查error:

iter.Release()

err = iter.Error()

if err != nil {

panic(err)

}

5.删除某条数据:err = db.Delete([]byte("2"), nil)

6.读取某条数据:data, err := db.Get([]byte("2"), nil)  fmt.Printf("[2]:%s:%s\n",data,err)

7.根据前缀"foo-"遍历数据库内容:iter = db.NewIterator(util.BytesPrefix([]byte("foo-")), nil)

8.遍历从指定 key开始,包括指定key:

iter = db.NewIterator(nil, nil)

for ok := iter.Seek([]byte("5")); ok; ok = iter.Next() {

fmt.Printf("[%s]:%s\n", iter.Key(), iter.Value())

}

9.遍历子集范围,以start开始到limit为止,包括两边:

iter = db.NewIterator(&util.Range{Start: []byte("foo"), Limit: []byte("loo")}, nil)

for iter.Next() {

fmt.Printf("[%s]:%s\n", iter.Key(), iter.Value())

}

10.批量处理数据,包括写入删除:

batch := new(leveldb.Batch)

batch.Put([]byte("foo"), []byte("value"))

batch.Put([]byte("bar"), []byte("another value"))

batch.Delete([]byte("baz"))

err = db.Write(batch, nil)

11.获取数据库快照:

snapshot, i := db.GetSnapshot()

    fmt.Println(snapshot)//leveldb.Snapshot{22}

    fmt.Println(i)//<nil>

    //注意: The snapshot must be released after use, by calling Release method.

    //也就是说snapshot在使用之后,必须使用它的Release方法释放!

    snapshot.Release()

示例源码:阅读原文即可获得,用法文档:https://godoc.org/github.com/syndtr/goleveldb/leveldb#OpenFile

希望大家关注我的微信公众号,日更一篇区块链技术博客不易,有疑问可以后台留言。

  相关解决方案