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