/bitcask

A tiny key-value store backed by Bitcask and Redis Serialization Protocol

Primary LanguageRustMIT LicenseMIT

Bitcask

The repositoy contains a simple key-value store that uses Bitcask as the storage engine and Redis Serialization Protocol (RESP) as the network protocol.

Features

  • Redis-compatible server and client
  • Lock-free concurrent reads
  • Asynchronous data compaction
  • Asynchronous disk synchronization

Usages

Clone the repository and build the project. Once finish, the executables are placed in the target/release folder.

$ git clone https://github.com/ltungv/bitcask.git
$ cd bitcask && cargo build --release

Get the server help message.

$ ./target/release/svr --help

USAGE:
    svr [OPTIONS]

OPTIONS:
    -c, --config <CONFIG>    Path to the configuration file without the extension [default: config]
    -h, --help               Print help information
    -V, --version            Print version information

Get the client help message.

$ ./target/release/cli --help

USAGE:
    cli [OPTIONS] <SUBCOMMAND>

OPTIONS:
    -h, --help           Print help information
        --host <HOST>    The host address of the server [default: 127.0.0.1]
        --port <PORT>    The port number of the server [default: 6379]
    -V, --version        Print version information

SUBCOMMANDS:
    del     Delete keys
    get     Get key's value
    help    Print this message or the help of the given subcommand(s)
    set     Set key's value

Configurations

To change the server settings, a configuration file is used. By default, the server will try to read the configuration file located at the directory where the server is run. Alternatively, a custom path to the configuration file can be given through the CLI upon startup. An example of the configuration file is given in config.toml.

net.host = "0.0.0.0"
net.port = 6379
net.min_backoff_ms = 500
net.max_backoff_ms = 64000
net.max_connections = 128

storage.path = "db"
storage.concurrency = 4
storage.readers_cache_size = 256
storage.max_file_size = 2000000000
storage.sync = "none"

storage.merge.policy = "always"
storage.merge.check_interval_ms = 180000
storage.merge.check_jitter = 0.3

storage.merge.triggers.fragmentation = 0.6
storage.merge.triggers.dead_bytes = 512000000

storage.merge.thresholds.fragmentation = 0.4
storage.merge.thresholds.dead_bytes = 128000000
storage.merge.thresholds.small_file = 10000000

Additionally, we can use environment variables to override the server settings. Environment variables that change the settings are prefixed with BITCASK, and the prefix along with nested fields are separated with double underscores __. For example, BITCASK__NET__HOST=127.0.0.1 will change to host address to 127.0.0.1, and BITCASK__STORAGE__MAX_FILE_SIZE=2 will change Bitcask's max file size to 2.

Supported Redis commands