Contents

Go leveldb

Go leveldb库

github地址:https://github.com/syndtr/goleveldb

安装:

go get github.com/syndtr/goleveldb/leveldb

简介:

levelDB在区块链中比较常用,其是Google开源的持久化单机Key-Value文件数据库,其支持按照文件大小切分文件的功能。levelDB具有很高的随机写,顺序读/写性能,但是随机读的性能很一般,也就是说,levelDB很适合应用在查询较少,而写很多的场景。

LevelDB特点

1)key和value都是任意长度的字节数组; 2)entry(即一条k-v记录)默认是按照key的字典顺序存储的,开发者也可以重写这个方法; 3)提供了基本的增删改查接口; 4)支持批量操作以原子操作进行; 5)开源创建数据全景的snapshot(快照),并允许在快照中查询; 6)开源通过向前(后)迭代器遍历数据(迭代器隐含的创建了一个snapshot); 7)自动使用Snappy压缩数据; 8)可移植性。

levelDB限制

1)NoSQL,不支持sql语句,也不支持索引; 2)一次只允许一个进程访问一个特定的数据库; 3)没有内置的C/S架构,开发者需要使用levelDB库自己封装一个server;

使用:

1)打开、创建数据库

db, err := leveldb.OpenFile("./block.db", nil)

2)写入key数据

err = db.Put([]byte("hello"), []byte("world"), nil)

3)读取key数据

data, _ := db.Get([]byte("hello"), nil)  

4)遍历数据库

iter := db.NewIterator(nil, nil)  
for iter.Next() {  
    logger.Debug(iter.Key() + iter.Value())  
}  

5)读取某个前缀的所有KEY数据

读出来的数据会被放进一个Iterator中。加入数据库现在有key-$num为头的数条数据

iter := db.NewIterator(dbUtil.BytesPrefix([]byte("key-")), nil)

遍历读取这些数据

for iter.Next() {
    logger.Debug(string(iter.Key()) + string(iter.Value()))
}

读取最后一条数据

if iter.Last() {
    logger.Debug(iter.Key() + iter.Value())
}

6)删除某个KEY

err = db.Delete([]byte("key-3"), nil)

7)批量写

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)