https://github.com/oneofone/jdb
A file-backed ACID in-memory k/v data store.
https://github.com/oneofone/jdb
Last synced: 8 months ago
JSON representation
A file-backed ACID in-memory k/v data store.
- Host: GitHub
- URL: https://github.com/oneofone/jdb
- Owner: OneOfOne
- License: apache-2.0
- Created: 2016-06-30T03:03:03.000Z (almost 10 years ago)
- Default Branch: master
- Last Pushed: 2016-07-09T22:28:41.000Z (almost 10 years ago)
- Last Synced: 2025-03-14T11:25:18.479Z (over 1 year ago)
- Language: Go
- Homepage:
- Size: 42 KB
- Stars: 2
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# jdb [](https://raw.githubusercontent.com/OneOfOne/jdb/master/LICENSE) 
**A file-backed ACID in-memory k/v data store.**
## FAQ
### Why would I use this over bolt or any other K/V store?
1. The data is always in memory, in a very simple memory layout and it is extremely fast.
2. You can specify the on-disk file format, the default is JSON, however
it is very easy to add your own.
3. You can use the values directly in your code without having to copy them*
4. You can fully replay the database and discard transactions as needed (not implemented yet).
* *modifying values without a copy can result in a race, but the on-disk data won't be corrupted.*
* *compacting the database will remove older transactions.*
### Why shouldn't I use this?
Mainly if your dataset doesn't fit in memory then you're better off with
an mmap'ed k/v store like the excellent [boltdb](https://github.com/boltdb/bolt).
## Benchmarks
```
➤ go test -benchmem -bench=. -v -benchtime=3s
=== RUN TestDB
--- PASS: TestDB (0.00s)
=== RUN TestCryptoBackend
--- PASS: TestCryptoBackend (0.00s)
BenchmarkJDBSameTxReadWriteJSON-8 2000000 2898 ns/op 312 B/op 10 allocs/op
BenchmarkJDBSameTxReadWriteGzipJSON-8 2000000 3027 ns/op 312 B/op 10 allocs/op
BenchmarkJDBSameTxReadWriteCryptoJSON-8 1000000 3077 ns/op 312 B/op 10 allocs/op
BenchmarkJDBSameTxReadWriteCryptoGzipJSON-8 2000000 2908 ns/op 312 B/op 10 allocs/op
BenchmarkBoltSameTxReadWrite-8 500000 8682 ns/op 6309 B/op 44 allocs/op
BenchmarkJDBSeparateReadWriteJSON-8 1000000 3000 ns/op 312 B/op 10 allocs/op
BenchmarkJDBSeparateReadWriteGzipJSON-8 1000000 3014 ns/op 312 B/op 10 allocs/op
BenchmarkJDBSeparateReadWriteCryptoJSON-8 2000000 3020 ns/op 312 B/op 10 allocs/op
BenchmarkJDBSeparateReadWriteCryptoGzipJSON-8 1000000 3000 ns/op 312 B/op 10 allocs/op
BenchmarkBoltSeparateReadWrite-8 500000 16040 ns/op 12416 B/op 53 allocs/op
PASS
ok github.com/OneOfOne/jdb 60.457s
```
## Examples
```go
//db, err := jdb.New(fp, &Opts{Backend: GZipJSONBackend})
db, err := jdb.New("db.jdb", nil) // default JSONBackend
if err != nil {
log.Panic(err)
}
defer db.Close()
err := db.Update(func(tx *Tx) error {
return tx.Set("a", []byte("a")) // or
// return tx.Set("a", jdb.Value("a"))
})
// shorthand for a single
err := db.SetObject("map in a sub-bucket", map[string]bool{
"isCool": true,
}, "parent bucket", "a bucket under the parent bucket")
```
## TODO
* Replay / Filter support.
* Per-bucket unique ID generation.
* Archiving support.
## License
Apache v2.0 (see [LICENSE](https://raw.githubusercontent.com/OneOfOne/jdb/master/LICENSE) file).
Copyright 2016-2016 Ahmed <[OneOfOne](https://github.com/OneOfOne/)> W.