rosedb is a fast, stable and embedded key-value (k-v) database based on bitcask. Its on-disk files are organized as WAL(Write Ahead Log) in LSM trees, optimizing for write throughput. rosedb supports a variety of data structures such as string
, list
, hash
, set
and sorted set
.
rosedb is written in pure Go
, easy to understand and use.
Our vision is to build an efficient k-v storage engine for Go-based applications. Feel free to give us any advices, and also please give us a star
string
, list
, hash
, set
, zset
.import "github.com/roseduan/rosedb"
).Navigate to rosedb/cmd/server and run main.go
Open a new terminal, navigate to rosedb/cmd/cli, and run main.go
:
Or you can just use redis-cli
or any other redis client:
Import rosedb in the application:
import "github.com/roseduan/rosedb"
Open a connection to the database:
package main
import (
"github.com/roseduan/rosedb"
"log"
)
func main() {
config := rosedb.DefaultConfig()
db, err := rosedb.Open(config)
if err != nil {
log.Fatal(err)
}
// don`t forget to close!
defer db.Close()
//...
}
docker build -t="rosedb:v1.2.9" .
docker run --name=rosedb -itd -p 5200:5200 rosedb:v1.2.9
docker exec -it rosedb sh
$ rosedb-cli
127.0.0.1:5200>set hello rosedb
OK
127.0.0.1:5200>get hello
rosedb
see here.
1,000,000 iterations
go test -bench=. -benchtime=1000000x
badger 2021/05/16 21:59:53 INFO: All 0 tables opened in 0s
badger 2021/05/16 21:59:53 INFO: Discard stats nextEmptySlot: 0
badger 2021/05/16 21:59:53 INFO: Set nextTxnTs to 0
goos: darwin
goarch: amd64
pkg: rosedb-bench
BenchmarkPutValue_BadgerDB-12 1000000 11518 ns/op 2110 B/op 46 allocs/op
BenchmarkGetValue_BadgerDB-12 1000000 3547 ns/op 1172 B/op 20 allocs/op
BenchmarkPutValue_GoLevelDB-12 1000000 4659 ns/op 352 B/op 9 allocs/op
BenchmarkGetValue_GoLevelDB-12 1000000 2838 ns/op 814 B/op 13 allocs/op
BenchmarkPutValue_Pudge-12 1000000 8512 ns/op 791 B/op 22 allocs/op
BenchmarkGetValue_Pudge-12 1000000 1253 ns/op 200 B/op 6 allocs/op
BenchmarkPutValue_RoseDB_KeyValRam-12 1000000 4371 ns/op 566 B/op 11 allocs/op
BenchmarkGetValue_RoseDB_KeyValRam-12 1000000 481 ns/op 56 B/op 3 allocs/op
BenchmarkPutValue_RoseDB_KeyOnlyRam-12 1000000 4255 ns/op 566 B/op 11 allocs/op
BenchmarkGetValue_RoseDB_KeyOnlyRam-12 1000000 2986 ns/op 312 B/op 8 allocs/op
PASS
ok rosedb-bench 46.388s
2,500,000 iterations
go test -bench=. -benchtime=2500000x
badger 2021/05/16 22:06:08 INFO: All 0 tables opened in 0s
badger 2021/05/16 22:06:08 INFO: Discard stats nextEmptySlot: 0
badger 2021/05/16 22:06:08 INFO: Set nextTxnTs to 0
goos: darwin
goarch: amd64
pkg: rosedb-bench
BenchmarkPutValue_BadgerDB-12 2500000 11660 ns/op 2150 B/op 46 allocs/op
BenchmarkGetValue_BadgerDB-12 2500000 4180 ns/op 1222 B/op 21 allocs/op
BenchmarkPutValue_GoLevelDB-12 2500000 4637 ns/op 336 B/op 9 allocs/op
BenchmarkGetValue_GoLevelDB-12 2500000 2942 ns/op 817 B/op 14 allocs/op
BenchmarkPutValue_Pudge-12 2500000 9238 ns/op 763 B/op 22 allocs/op
BenchmarkGetValue_Pudge-12 2500000 1275 ns/op 200 B/op 6 allocs/op
BenchmarkPutValue_RoseDB_KeyValRam-12 2500000 4474 ns/op 566 B/op 11 allocs/op
BenchmarkGetValue_RoseDB_KeyValRam-12 2500000 525 ns/op 56 B/op 3 allocs/op
BenchmarkPutValue_RoseDB_KeyOnlyRam-12 2500000 4294 ns/op 566 B/op 11 allocs/op
BenchmarkGetValue_RoseDB_KeyOnlyRam-12 2500000 3038 ns/op 312 B/op 8 allocs/op
PASS
ok rosedb-bench 119.529s
Badger
Stable read and write performance. Write: 11000+ ns/op. Read: 4000+ ns/op.
GoLevelDB
Write performance is almost 2.5x that of Badger. Read is almost 3000 ns/op, a little faster than that of Badger.
Pudge
Write performance is between that of GoLevelDB and Badger, almost 8500 ns/op. Read is very fast and stable, almost twice as fast as that of GoLevelDB.
RoseDB
Write performance is stable, almost the same as that of GoLevelDB, 2.5x that of Badger.
In KeyValueRamMode, since the values are all in memory, it is the fastest of all.
In KeyOnlyRamMode, it is almost the same as GoLevelDB.
If you are intrested in contributing to rosedb, please see here: CONTRIBUTING
If you have any questions, you can contact me by email: roseduan520@gmail.com
rosedb is licensed under the term of the MIT License
一、前言 事务是传统关系型数据库中必不可少的功能,例如 Mysql、Oracle、PostgreSql 都支持事务,但是在 NoSQL 数据库中,事务的概念比较弱化,在实现上也没有关系型数据库那么复杂。 但是为了数据的完整一致性,大多数 k-v 都会实现事务的基本特性,例如 k-v 数据库的两大鼻祖 LevelDB 和 RocksDB,一些 Go 语言实现的开源 k-v 也都支持事务,例如 Bol