goleveldb | 青训营笔记

599 阅读1分钟

这是我参与「第三届青训营 -后端场」笔记创作活动的的第5篇笔记

levelDB是一个kv型的文件数据库,支持按照文件大小来切分文件。

特点

LevelDB 是单进程的服务,性能非常之高,在一台4核Q6600的CPU机器上,每秒钟写数据超过40w,而随机读的性能每秒钟超过10w。

此处随机读是完全命中内存的速度,如果是不命中,速度大大下降。

缺点

1、NoSQL的数据库,不支持SQL语法,也不支持索引 2、一次只允许一个进程访问一个数据库

goleveldb

github网址:github.com/syndtr/gole…

下载

go get github.com/syndtr/goleveldb/leveldb

创建数据库

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

defer db.Close()

读取或修改数据库内容

data, err := db.Get([]byte("key"), nil)

err = db.Put([]byte("key"), []byte("value"), nil)

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

遍历数据库内容

iter := db.NewIterator(nil, nil)
for iter.Next() {
	key := iter.Key()
	value := iter.Value()
}
iter.Release()
err = iter.Error()

遍历特定前缀的数据库内容

iter := db.NewIterator(util.BytesPrefix([]byte("foo-")), nil)
for iter.Next() {
	// Use key/value.
}
iter.Release()
err = iter.Error()

遍历特定范围的数据库内容

iter := db.NewIterator(&util.Range{Start: []byte("foo"), Limit: []byte("xoo")}, nil)
for iter.Next() {
	// Use key/value.
}
iter.Release()
err = iter.Error()

批量写入

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)

使用布隆过滤器

o := &opt.Options{
	Filter: filter.NewBloomFilter(10),
}
db, err := leveldb.OpenFile("path/to/db", o)
...
defer db.Close()