https://github.com/recoilme/b52
b52 is a fast experimental Key/value database. With support for the memcache protocol.
https://github.com/recoilme/b52
database evio freecache key-value memcache-protocol memcached sniper
Last synced: 4 months ago
JSON representation
b52 is a fast experimental Key/value database. With support for the memcache protocol.
- Host: GitHub
- URL: https://github.com/recoilme/b52
- Owner: recoilme
- Created: 2019-10-01T15:14:12.000Z (over 6 years ago)
- Default Branch: master
- Last Pushed: 2023-07-27T13:06:46.000Z (almost 3 years ago)
- Last Synced: 2025-04-24T18:51:08.423Z (about 1 year ago)
- Topics: database, evio, freecache, key-value, memcache-protocol, memcached, sniper
- Language: Go
- Size: 7.42 MB
- Stars: 33
- Watchers: 4
- Forks: 3
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
b52
[](https://godoc.org/github.com/recoilme/b52)
b52 is a fast experimental Key/value database. With support for the memcache protocol.
# Getting Started
## Installing
To start using `b52`, install Go and run `go get`:
```sh
$ go get -u github.com/recoilme/b52
$ go build or go install
```
This will retrieve and build the server. Or grab compiled binary version.
## Starting
Use `./b52 --help` for full list of params. Example:
```sh
./b52 -p 11212 -params "sizelru=10&sizettl=10&dbdir="
# Start server on port 11212 with 10Mb lru and ttl cache size, without persistent database.
```
or just ./b52 - for start with default params
## How it work
`b52` is a layered database composed of a sniper, evio and freecache.
When b52 prepared properly, the ingredients separate into three distinctly visible layers.
It use [evio](https://github.com/tidwall/evio) for network communications.
[sniper](https://github.com/recoilme/sniper) - [fast](https://github.com/recoilme/sniper#performance), persistant on disk storage
[freecache](https://github.com/coocood/freecache) - in memory, [with zero GC overhead](https://github.com/coocood/freecache#features) cache, for keys with TTL (time to live) and LRU cache
### The balance between speed and efficiency is achieved as follows:
New entries go to disk (sniper). As you access them, they are cached in the LRU-cache (freecache). Life-limited records are stored separately, in freecache (without persistance storage).
## Memory usage
For minimizing GC and allocations overhead - Sniper stored keys, and value addres/size in plain hash (map[uint32]uint32). HashMaps are fast, but has a memory cost. You must have 2Gb+ memory for storing every 100_000_000 entrys.
In Freecache memory is preallocated and it's size depends from you.
## Disk usage
Sniper has a minimum 8 byte overhead on every entry. But it allocate space in power of 2, and try to reuse space, if value grow. Also, sniper will try to reuse space from deleted/evicted records.
## Telnet example
```
telnet localhost 11211
set a 0 0 5
12345
STORED
get a
VALUE a 0 5
12345
END
close
```
## Memcache protocol
b52 use text version of [memcache protocol](https://github.com/memcached/memcached/blob/master/doc/protocol.txt). With this commands:
```
cmdAdd = []byte("add")
cmdReplace = []byte("replace")
cmdSet = []byte("set")
cmdGet = []byte("get")
cmdGets = []byte("gets")
cmdClose = []byte("close")
cmdDelete = []byte("delete")
cmdIncr = []byte("incr")
cmdDecr = []byte("decr")
cmdStats = []byte("stats")
cmdQuit = []byte("quit")
cmdVersion = []byte("version")
```
## mc-benchmark
[mc-benchmark](https://github.com/antirez/mc-benchmark)
```
Database params (running as master/slave, 1Gb lru cache, 100 Mb ttl cache, stats after 3 days using):
stats
STAT version 0.1.3
bytes 2301825272
heap_sys_mb 2103
curr_items 17165174
cmd_get 6660544669
cmd_set 6494641380
file_size 14172392544
test (on production, with ~2k active connections at same time):
./mc-benchmark -p 11222
====== SET ======
10000 requests completed in 0.10 seconds
50 parallel clients
3 bytes payload
keep alive: 1
56.39% <= 0 milliseconds
95.39% <= 1 milliseconds
100.00% <= 2 milliseconds
101010.10 requests per second
====== GET ======
10014 requests completed in 0.08 seconds
50 parallel clients
3 bytes payload
keep alive: 1
60.25% <= 0 milliseconds
100.00% <= 1 milliseconds
123629.63 requests per second
./mc-benchmark -n 100000 -p 11212
====== SET ======
100003 requests completed in 1.03 seconds
50 parallel clients
3 bytes payload
keep alive: 1
49.59% <= 0 milliseconds
99.16% <= 1 milliseconds
100.00% <= 2 milliseconds
96996.12 requests per second
====== GET ======
100018 requests completed in 0.98 seconds
50 parallel clients
3 bytes payload
keep alive: 1
51.55% <= 0 milliseconds
99.72% <= 1 milliseconds
99.99% <= 2 milliseconds
100.00% <= 3 milliseconds
101851.33 requests per second
```
[expvar](https://gist.github.com/recoilme/0624cd5ecda195c804b67b1d64394603)
## Contact
Vadim Kulibaba [@recoilme](https://github.com/recoilme)
## License
`b52` source code is available under the MIT [License](/LICENSE).