Embedded key-value store for read-heavy workloads written in Go
Switch branches/tags
Nothing to show
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Failed to load latest commit information.
fs
hash
.gitignore
.travis.yml
LICENSE
README.md
appveyor.yml
bucket.go
datafile.go
db.go
db_test.go
doc.go
errors.go
file.go
freelist.go
freelist_test.go
header.go
iterator.go
iterator_test.go
logger.go
metrics.go
options.go
recovery.go

README.md

Pogreb GoDoc Build Status Windows Build status Go Report Card

Pogreb is an embedded key-value store for read-heavy workloads written in Go.

Key characteristics

  • 100% Go.
  • Optimized for fast random lookups and infrequent bulk inserts.
  • Can store larger-than-memory data sets.
  • Low memory usage.
  • All DB methods are safe for concurrent use by multiple goroutines.

Installation

$ go get -u github.com/akrylysov/pogreb

Usage

Opening a database

To open or create a new database, use the pogreb.Open() function:

package main

import (
	"log"

	"github.com/akrylysov/pogreb"
)

func main() {
    db, err := pogreb.Open("pogreb.test", nil)
    if err != nil {
        log.Fatal(err)
        return
    }	
    defer db.Close()
}

Writing to a database

Use the DB.Put() function to insert a new key/value pair:

err := db.Put([]byte("testKey"), []byte("testValue"))
if err != nil {
	log.Fatal(err)
}

Reading from a database

Use the DB.Get() function to retrieve the inserted value:

val, err := db.Get([]byte("testKey"))
if err != nil {
	log.Fatal(err)
}
log.Printf("%s", val)

Iterating over items

Use the DB.Items() function which returns a new instance of ItemIterator:

it := db.Items()
for {
    key, val, err := it.Next()
    if err != nil {
        if err != pogreb.ErrIterationDone {
            log.Fatal(err)
        }
        break
    }
    log.Printf("%s %s", key, val)
}

Performance

The benchmarking code can be found in the pogreb-bench repository.

Results of read performance benchmark of pogreb, goleveldb, bolt and badgerdb on DigitalOcean 8 CPUs / 16 GB RAM / 160 GB SSD + Ubuntu 16.04.3 (higher is better):

Internals

Pogreb - how it works.