原文
A key-value store inspired by Bitcask.
FileDB is a Zig-implementation of Bitcask by Riak1 paper.
- FileDB stores record metadata in a log-structured hashtable and parallely keeps 1 disk file open for inserting records in append-only mode. On restarts or
MAX_FILE_REACHED
, the disk file is rotated and all the oldfiles are kept open for reading only. - A compaction process running every
config.compactionInterval
seconds, reads all the disk files and combines them into one file while updating the metadata hashtable. - A sync process syncs the open disk files once every
config.syncInterval
. Sync also can be done on every request ifconfig.alwaysFsync
is True.
Read about internals in-depth at FileDb.
- Since the metadata keeps an exact location of file and position in file for a record, fetching records become O(1) operation.
- All metadata records are constant size, so irrespective of the size of the value of a record the in-memory store keeps a constant sized metadata.
- Provides high throughput by using the open file in append only mode.
init(allocator: std.mem.Allocator, options: ?config.Options)
: Intialized FileDBdeinit()
: Deinitalizes FileDBput(key:[]const u8, value: []const u8)
: Inserts a key-value pair in the database to be tracked.get(key:[]const u8)
: Retrieved a key-value pair from the database.delete(key: []const u8)
: Delete a key-value pair from the databaselist(allocator: std.mem.Allocator)
: Returns a list of keys stored in the database.sync()
: Syncs the current open datafile on the diskstoreHashMap()
: Creates the HINTS fileloadKeyDir()
: Loads the hashmap from the HINTS file
Along with the library, a Redis-compatible client is available.
127.0.0.1:6379> RING
(error) ERR unknown command
127.0.0.1:6379> PING
PONG
127.0.0.1:6379> get abcd
(nil)
127.0.0.1:6379> set abcd def
OK
127.0.0.1:6379> get abcd
"def"
redis-benchmark -p 6379 -t set -n 10000 -r 100000000
Summary:
throughput summary: 13736.26 requests per second
latency summary (msec):
avg min p50 p95 p99 max
3.615 0.088 3.455 6.831 8.831 14.919
redis-benchmark -p 6379 -t set -n 200000 -r 100000000
Summary:
throughput summary: 14375.04 requests per second
latency summary (msec):
avg min p50 p95 p99 max
3.452 0.072 3.087 6.767 10.647 114.303
redis-benchmark -p 6379 -t get -n 100000 -r 100000000
Summary:
throughput summary: 44286.98 requests per second
latency summary (msec):
avg min p50 p95 p99 max
0.573 0.088 0.519 0.967 1.447 7.495
redis-benchmark -p 6379 -t get -n 1000000 -r 1000000000 --threads 10
Summary:
throughput summary: 104876.77 requests per second
latency summary (msec):
avg min p50 p95 p99 max
0.405 0.032 0.375 0.831 1.295 26.047
- https://www.openmymind.net/Basic-MetaProgramming-in-Zig/
- https://pedropark99.github.io/zig-book/
- https://zig.guide/standard-library/
- https://zighelp.org