Go to file
Awn c28c72108f Use consistent directory names in benchmarks (#24)
* patch: use current directory for benchmarks

* Use consistent directory names
2019-07-25 08:18:41 +10:00
cmd Add KeYS command to server (bitraftd) 2019-03-21 10:49:53 +10:00
internal Fix issue(db file Merge issue in windows env): (#15) 2019-07-23 13:27:14 +10:00
tools Fixed typo in release.sh (#8) 2019-04-25 22:19:20 +10:00
_config.yml Set theme jekyll-theme-hacker 2019-03-13 00:06:31 +10:00
.drone.yml Increased read performance by ~3-4x by removing another unnecessary I/O operation (Seek) 2019-03-23 12:14:15 +10:00
.gitignore Add a simple Redis compatible server daemon (bitcaskd) 2019-03-13 21:19:46 +10:00
.goreleaser.yml Fixed injecting Version/Commit in relased binaries 2019-03-19 18:55:03 +10:00
bitcask_test.go Use consistent directory names in benchmarks (#24) 2019-07-25 08:18:41 +10:00
bitcask.go patch: use directory within database path for merge (#21) 2019-07-25 08:01:12 +10:00
CODE_OF_CONDUCT.md Create CODE_OF_CONDUCT.md 2019-03-13 06:45:43 +10:00
CONTRIBUTING.md Create CONTRIBUTING.md 2019-04-01 10:14:40 +10:00
Dockerfile Add Dockerfile to publish images to Docker Hub 2019-03-30 17:14:09 +10:00
go.mod update dependencies (#22) 2019-07-25 08:02:00 +10:00
go.sum update dependencies (#22) 2019-07-25 08:02:00 +10:00
LICENSE Create LICENSE 2019-03-13 06:46:32 +10:00
Makefile Increased read performance by ~3-4x by removing another unnecessary I/O operation (Seek) 2019-03-23 12:14:15 +10:00
options.go Add docs for options 2019-03-21 17:20:53 +10:00
README.md Fix mismatched key casing. (#12) 2019-06-12 07:29:11 +10:00

bitcask

Build Status CodeCov Go Report Card GoDoc Sourcegraph Github all releases GitHub license

A high performance Key/Value store written in Go with a predictable read/write performance and high throughput. Uses a Bitcask on-disk layout (LSM+WAL) similar to Riak. 🗃️

For a more feature-complete Redis-compatible server, distributed key/value store have a look at Bitraft which uses this library as its backend. Use Bitcask as a starting point or if you want to embed in your application, use Bitraft if you need a complete server/client solution with high availability with a Redis-compatible API.

Features

  • Embeddable (import "github.com/prologic/bitcask")
  • Builtin CLI (bitcask)
  • Builtin Redis-compatible server (bitcaskd)
  • Predictable read/write performance
  • Low latecny
  • High throughput (See: Performance )

Development

  1. Get the source
$ git clone https://github.com/prologic/bitcask.git
  1. Install required tools

This library uses Protobuf to serialize data on disk. Please follow the instructions for installing protobuf on your system. You will also need the following Go libraries/tools to generate Go code from Protobuf defs:

  1. Build the project
$ make

This will invoke go generate and go build.

Install

$ go get github.com/prologic/bitcask

Usage (library)

Install the package into your project:

$ go get github.com/prologic/bitcask
package main

import "github.com/prologic/bitcask"

func main() {
    db, _ := bitcask.Open("/tmp/db")
    defer db.Close()
    db.Put("Hello", []byte("World"))
    val, _ := db.Get("Hello")
}

See the godoc for further documentation and other examples.

Usage (tool)

$ bitcask -p /tmp/db set Hello World
$ bitcask -p /tmp/db get Hello
World

Usage (server)

There is also a builtin very simple Redis-compatible server called bitcaskd:

$ ./bitcaskd ./tmp
INFO[0000] starting bitcaskd v0.0.7@146f777              bind=":6379" path=./tmp

Example session:

$ telnet localhost 6379
Trying ::1...
Connected to localhost.
Escape character is '^]'.
SET foo bar
+OK
GET foo
$3
bar
DEL foo
:1
GET foo
$-1
PING
+PONG
QUIT
+OK
Connection closed by foreign host.

Docker

You can also use the Bitcask Docker Image:

$ docker pull prologic/bitcask
$ docker run -d -p 6379:6379 prologic/bitcask

Performance

Benchmarks run on a 11" Macbook with a 1.4Ghz Intel Core i7:

$ make bench
...
BenchmarkGet/128B-4         	  500000	      2537 ns/op	     672 B/op	       7 allocs/op
BenchmarkGet/256B-4         	  500000	      2629 ns/op	    1056 B/op	       7 allocs/op
BenchmarkGet/512B-4         	  500000	      2773 ns/op	    1888 B/op	       7 allocs/op
BenchmarkGet/1K-4           	  500000	      3202 ns/op	    3552 B/op	       7 allocs/op
BenchmarkGet/2K-4           	  300000	      3904 ns/op	    6880 B/op	       7 allocs/op
BenchmarkGet/4K-4           	  300000	      5678 ns/op	   14048 B/op	       7 allocs/op
BenchmarkGet/8K-4           	  200000	      8948 ns/op	   27360 B/op	       7 allocs/op
BenchmarkGet/16K-4          	  100000	     14635 ns/op	   53472 B/op	       7 allocs/op
BenchmarkGet/32K-4          	   50000	     28292 ns/op	  114912 B/op	       7 allocs/op

BenchmarkPut/128B-4         	  200000	      8173 ns/op	     409 B/op	       6 allocs/op
BenchmarkPut/256B-4         	  200000	      8404 ns/op	     538 B/op	       6 allocs/op
BenchmarkPut/512B-4         	  200000	      9741 ns/op	     829 B/op	       6 allocs/op
BenchmarkPut/1K-4           	  100000	     13118 ns/op	    1411 B/op	       6 allocs/op
BenchmarkPut/2K-4           	  100000	     17982 ns/op	    2573 B/op	       6 allocs/op
BenchmarkPut/4K-4           	   50000	     35477 ns/op	    5154 B/op	       6 allocs/op
BenchmarkPut/8K-4           	   30000	     54021 ns/op	    9804 B/op	       6 allocs/op
BenchmarkPut/16K-4          	   20000	     96551 ns/op	   18849 B/op	       6 allocs/op
BenchmarkPut/32K-4          	   10000	    129957 ns/op	   41561 B/op	       7 allocs/op

BenchmarkScan-4             	 1000000	      2011 ns/op	     493 B/op	      25 allocs/op

For 128B values:

  • ~400,000 reads/sec
  • ~130,000 writes/sec

The full benchmark above shows linear performance as you increase key/value sizes.

License

bitcask is licensed under the MIT License