Granite 是一个使用 Go 编写的单机 LSM-tree 键值存储引擎。
go get github.com/DecarbonizedGlucose/granitepackage main
import (
"errors"
"log"
"github.com/DecarbonizedGlucose/granite"
)
func main() {
db, err := granite.Open("./data", nil)
if err != nil {
log.Fatal(err)
}
defer db.Close()
if err := db.Put([]byte("key"), []byte("value"), nil); err != nil {
log.Fatal(err)
}
value, err := db.Get([]byte("key"), nil)
if err != nil && !errors.Is(err, granite.ErrNotFound) {
log.Fatal(err)
}
_ = value
if err := db.Delete([]byte("key"), nil); err != nil {
log.Fatal(err)
}
}batch := granite.MakeBatch(0)
batch.Put([]byte("a"), []byte("1"))
batch.Put([]byte("b"), []byte("2"))
batch.Delete([]byte("c"))
err := db.Write(batch, nil)
batch.Reset()keyRange := &granite.Range{
Start: []byte("a"),
Limit: []byte("z"),
}
it := db.NewIterator(keyRange, nil)
defer it.Close()
for ok := it.First(); ok; ok = it.Next() {
key := it.Key()
value := it.Value()
_, _ = key, value
}
if err := it.Error(); err != nil {
return err
}Iterator 同时提供 First、Last、Seek、Next、Prev、Valid、
Key、Value、Error 和 Close。
snapshot, err := db.NewSnapshot()
if err != nil {
return err
}
defer snapshot.Close()
value, err := snapshot.Get([]byte("key"), nil)
it := snapshot.NewIterator(nil, nil)
defer it.Close()db, err := granite.Open("./data", &granite.Options{
WriteBuffer: 4 << 20,
NoSync: false,
})
value, err := db.Get(key, &granite.ReadOptions{
DontFillCache: true,
})
err = db.Put(key, value, &granite.WriteOptions{
SyncEachTime: true,
})公开错误值包括 ErrNotFound、ErrClosed、ErrIterClosed 和
ErrSnapshotClosed。