Kvrocks is a key-value NoSQL database based on RocksDB and compatible with Redis protocol.

kvrocks_logo

image image GitHub license GitHub stars

Kvrocks is an open-source key-value database which is based on rocksdb and compatible with Redis protocol. Intention to decrease the cost of memory and increase the capability while compared to Redis. The design of replication and storage was inspired by rocksplicator and blackwidow.

Kvrocks has the following key features:

  • Redis protocol, user can use redis client to visit the kvrocks
  • Namespace, similar to redis db but use token per namespace
  • Replication, async replication using binlog like MySQL
  • High Available, supports redis sentinel to failover when master or slave was failed

Thanks for designers @田凌宇 and @范世丽 contribute the kvrocks logo for us.

Who uses kvrocks

Meitu Ctrip BaishanCloud

Tickets a pull reqeust to let us known that you're using kvrocks and add your logo to README

Building kvrocks

requirements

  • g++ (required by c++11, version >= 4.8)
  • autoconf automake libtool snappy

Build

NOTE: You should install the snappy first:

# Centos/Redhat
sudo yum install -y epel-release && sudo yum install -y git gcc gcc-c++ make snappy snappy-devel autoconf automake libtool which gtest gtest-devel

# Ubuntu
sudo apt-get install gcc g++ make libsnappy-dev autoconf automake libtool which libgtest-dev

# MACOSX
brew install snappy googletest

It is as simple as:

$ git clone --recursive https://github.com/bitleak/kvrocks.git
$ cd kvrocks
$ make -j4

Running kvrocks

$ ./src/kvrocks -c kvrocks.conf

Running test cases

NOTE: You should install the googletest first

make test

Supported platforms

  • centos 6/7
  • ubuntu
  • macosx

Try kvrocks using Docker

$ docker run -it -p 6666:6666 bitleak/kvrocks
$ redis-cli -p 6666

127.0.0.1:6666> get a
(nil)

Namespace

namespace was used to isolate data between users. unlike all the redis databases can be visited by requirepass, we use one token per namespace. requirepass was regraded as admin token, only admin token allows to access the namespace command, as well as some commands like config, slaveof, bgsave, etc…

namespace del ns1 OK ">
# add token
127.0.0.1:6666>  namespace add ns1 mytoken
OK

# update token
127.0.0.1:6666> namespace set ns1 new_token
OK

# list namespace
127.0.0.1:6666> namespace get *
1) "ns1"
2) "new_token"
3) "__namespace"
4) "foobared"

# delete namespace
127.0.0.1:6666> namespace del ns1
OK

DOCs

Migrate tools

  • migrate from redis to kvrocks, use redis-migrate-tool which was developed by vipshop
  • migrate from kvrocks to redis. use kvrocks2redis in build dir

Performance

Hardware

  • CPU: 48 cores Intel(R) Xeon(R) CPU E5-2650 v4 @ 2.20GHz
  • Memory: 32 GiB
  • NET: Intel Corporation I350 Gigabit Network Connection
  • DISK: 2TB NVMe Intel SSD DC P460

Benchmark Client: multi-thread redis-benchmark(unstable branch)

1. Commands QPS

kvrocks: workers = 16, benchmark: 8 threads/ 512 conns / 128 payload

latency: 99.9% < 10ms

image

2. QPS on different payloads

kvrocks: workers = 16, benchmark: 8 threads/ 512 conns

latency: 99.9% < 10ms

image

3. QPS on different workers

kvrocks: workers = 16, benchmark: 8 threads/ 512 conns / 128 payload

latency: 99.9% < 10ms

image

License

Kvrocks is under the BSD-3-Clause license. See the LICENSE file for details.

Owner
Bit Leak
Focus on open-source infra services ❤️
Bit Leak
Comments
  • [QUESTION] Change the license to Apache License Version 2.0

    [QUESTION] Change the license to Apache License Version 2.0

    Hi, all Kvrocks contributors, we want to donate Kvrocks to Apache Software Foundation, the first step for us is changing the license to Apache License Version 2.0. As we know, Kvrocks is an open source software under the BSD-3-Clause license, we truly thank every contributor and user, you guys make Kvrocks great and have an active community, before we could submit PR to change license, we must to get your approval.

    @git-hulk @karelrooted @ShooterIT @Alfejik @caipengbo @ChrisZMF @shangxiaoxiong @ColinChamber @guoxiangCN @calvinxiao @patpatbear @WyattJia @smartlee @popunit @clyang @byronhe @QQxiaoyuyu @nioshield @singgel @liangjingyang @gaoyuanzong @rongzeng54 @unext-ops @fishery86 @xujianhai666 @LykxSassinator

    Please reply "Approved" if you agree.

  • 同步基本不可用

    同步基本不可用

    1. masterA 有数据 slaveA slaveof过来,数据可以同步,flushall masterA的数据, slaveA 没有同步清空掉。都执行过dbsize scan 2)masterB 没数据 slaveB 同步过来up后 ,masterB上执行写数据,数据没有同步到slaveB 3)slaveof后 slave节点上经常会报以下错误, 但这个目录是清空后再启动slave的
    E0216 13:35:53.319345 26935 storage.cc:703] [storage] Failed to delete dir: IO error: file rmdir: ./kvrocksdatamaster/backup/meta: Directory not empty
    E0216 13:35:53.415446 26935 replication.cc:584] [replication] Failed to restore backup while IO error: No such file or directoryWhile opening a file for sequentially reading: ./kvrocksdatamaster/backup/meta/5: No such file or directory
    Segmentation fault (core dumped)
    
  • Revert

    Revert "Fix the misuse of multi-get API"

    Reverts KvrocksLabs/kvrocks#442 l find that new multi-get api can get keys which have been deleted before. the case could be reproduced with my PR KvrocksLabs/kvrocks/pull/444 . It seems a bug of RocksDB and I would submit a relevant PR to RocksDB in the near future.

  • Tracking issue for build system enhancements

    Tracking issue for build system enhancements

    Search before asking

    • [X] I had searched in the issues and found no similar issues.

    Motivation

    Modern CMake provides many amazing features to organize the build structure of a project in a more convenient way, and we can make full use of them to improve the development experience! @tisonkun had a good suggestion in https://github.com/apache/incubator-kvrocks/issues/562#issuecomment-1123771508 of creating a tracking issue to help keep the discussion more focused, so this issue is created for that purpose.

    Solution

    The list below tracks some of the improvements that have been proposed so far, and I'd appreciate it if anyone came up with new ideas for improvements, PRs for current improvements, or participated in this discussion!

    • [x] #561
    • [x] #562
    • [x] #574
    • [x] #569
    • [x] #563
    • [x] #580
    • [x] #589
    • [x] #590

    Are you willing to submit a PR?

    • [X] I'm willing to submit a PR!
  • Memory leaks in Lua::redisGenericCommand

    Memory leaks in Lua::redisGenericCommand

    Search before asking

    • [X] I had searched in the issues and found no similar issues.

    Version

    redisGenericCommand use raiseError to process errors, but raiseError will perform a longjmp in the lua_error api call, so raiseError never returns.

    longjmp does not compatible with RAII in C++ (C++ exceptions may use longjmp in implementation but the compiler will insert some dtor call autometically and carefully, i.e. stack unwinding), so every object in the stack of redisGenericCommand will never be destroyed, i.e. no destructor will be call, hence all resource allocated in ctor like std::vector, std::unique_ptr etc. cannot be released.

    @git-hulk

    Minimal reproduce step

    ./runtest --dont-clean on a kvrocks binary with Address Sanitizer enabled. (try to build with #599) You can only run tests in unit/scripting to save time : )

    What did you expect to see?

    No memory leaks

    What did you see instead?

    Memory leaks are reported by Address Sanitizer

    Anything Else?

    No response

    Are you willing to submit a PR?

    • [X] I'm willing to submit a PR!
  • [BUG]  Failed to open DB with missing CURRENT file

    [BUG] Failed to open DB with missing CURRENT file

    Describe the bug A clear and concise description of what the bug is.

    • OS: MAC OS 10.15.7
    • Version 2.0.5 @6a4ed16a

    get following error message when try to start up kvrocks ( first time run )

    E1229 15:41:02.217978 276704704 main.cc:314] Failed to open: IO error: No such file or directory: While opening a file for sequentially reading: /tmp/kvrocks/db/CURRENT: No such file or directory

    /tmp/kvrocks directory did exist but no sub-directory ./db under it.

  • [NEW] Consider using `FetchContent` instead of `ExternalProject` and git submodules?

    [NEW] Consider using `FetchContent` instead of `ExternalProject` and git submodules?

    FetchContent has been adopted by many projects as a dependency fetching method introduced in newer versions of cmake, for example the official documentation for gtest already recommends using FetchContent to import itself into other projects (replacing the previous recommended ExternalProject).

    The advantage of FetchContent is that it is executed during the cmake configuration phase, which allows the configuration information of dependent projects to be introduced into the main project, unlike ExternalProject, which is executed during the build phase.

    This is quite useful especially for dependency projects built with cmake, because the configured cmake target of a dependency project can be used directly in the main project via add_subdirectory (e.g. gtest::gtest), instead of having to manually configure the dependency's header directories, static or shared libraries, compilation options, install directories, etc. and keeping maintaining these redundant information in the main project.

    This also makes git submodules unnecessary: by FetchContent, dependencies can be downloaded and configured at the cmake configuration stage, and URLs and commit hash/tag can be flexibly adjusted based on cmake options.

    There are NOT a lot of dependencies in kvrocks, and I think using FetchContent to manage dependencies as opposed to ExternalProject will improve the development experience. Of course, introducing a dependency manager such as vcpkg or conan may be a good option, but it introduces additional complexity in development and build management, so there is a trade-off.

    I'm happy to provide PRs if that sounds like a good idea.

    @tisonkun

  • [BUG] Kvrocks could not swich databases

    [BUG] Kvrocks could not swich databases

    Describe the bug Kvrocks could not swich databases, any database key-value changes effect to all-other databases;

    • OS: Ununtu 20.04 /docker
    • Version 2.06/2.05

    To Reproduce Steps to reproduce the behavior:

    1. select 1 -> set t 1 -> get t -> "1"
    2. select 2 -> get t -> "1"

    Expected behavior database-1 key-value should not exist in database-2

    127.0.0.1:6666> info
    # Server
    version:2.0.6
    git_sha1:7c23f2fe
    os:Linux 5.11.0-36-generic x86_64
    gcc_version:7.5.0
    arch_bits:64
    process_id:1
    tcp_port:6666
    uptime_in_seconds:1277
    uptime_in_days:0
    # Clients
    maxclients:10000
    connected_clients:2
    monitor_clients:0
    # Memory
    used_memory_rss:26529792
    used_memory_human:25.30M
    used_memory_lua:36864
    used_memory_lua_human:36.00K
    # Persistence
    loading:0
    bgsave_in_progress:0
    last_bgsave_time:-1
    last_bgsave_status:ok
    last_bgsave_time_sec:-1
    # Stats
    total_connections_received:514
    total_commands_processed:3090
    instantaneous_ops_per_sec:1
    total_net_input_bytes:76505
    total_net_output_bytes:3490146
    instantaneous_input_kbps:0
    instantaneous_output_kbps:5
    sync_full:0
    sync_partial_ok:0
    sync_partial_err:0
    pubsub_channels:0
    pubsub_patterns:0
    # Replication
    role:master
    connected_slaves:0
    master_repl_offset:1175757
    # CPU
    used_cpu_sys:0
    used_cpu_user:1
    # Commandstats
    cmdstat_auth:calls=514,usec=1788,usec_per_call=3
    cmdstat_client:calls=511,usec=747,usec_per_call=1
    cmdstat_command:calls=3,usec=1770,usec_per_call=590
    cmdstat_config:calls=510,usec=82148,usec_per_call=161
    cmdstat_get:calls=4,usec=148,usec_per_call=37
    cmdstat_info:calls=515,usec=373014,usec_per_call=724
    cmdstat_keys:calls=5,usec=1709,usec_per_call=341
    cmdstat_select:calls=6,usec=16,usec_per_call=2
    cmdstat_set:calls=2,usec=268,usec_per_call=134
    cmdstat_slowlog:calls=1020,usec=3864,usec_per_call=3
    # Keyspace
    # Last scan db time: Thu Jan  1 00:00:00 1970
    db0:keys=0,expires=0,avg_ttl=0,expired=0
    sequence:1175757
    used_db_size:51464
    max_db_size:0
    used_percent: 0%
    disk_capacity:490651459584
    used_disk_size:111368089600
    used_disk_percent: 22%
    # RocksDB
    estimate_keys[default]:0
    block_cache_usage[default]:4256
    block_cache_pinned_usage[default]:480
    index_and_filter_cache_usage[default]:0
    level0_file_limit_slowdown[default]:0
    level0_file_limit_stop[default]:0
    pending_compaction_bytes_slowdown[default]:0
    pending_compaction_bytes_stop[default]:0
    memtable_count_limit_slowdown[default]:0
    memtable_count_limit_stop[default]:0
    estimate_keys[metadata]:4
    block_cache_usage[metadata]:4256
    block_cache_pinned_usage[metadata]:480
    index_and_filter_cache_usage[metadata]:224
    level0_file_limit_slowdown[metadata]:0
    level0_file_limit_stop[metadata]:0
    pending_compaction_bytes_slowdown[metadata]:0
    pending_compaction_bytes_stop[metadata]:0
    memtable_count_limit_slowdown[metadata]:0
    memtable_count_limit_stop[metadata]:0
    estimate_keys[zset_score]:0
    block_cache_usage[zset_score]:4256
    block_cache_pinned_usage[zset_score]:480
    index_and_filter_cache_usage[zset_score]:0
    level0_file_limit_slowdown[zset_score]:0
    level0_file_limit_stop[zset_score]:0
    pending_compaction_bytes_slowdown[zset_score]:0
    pending_compaction_bytes_stop[zset_score]:0
    memtable_count_limit_slowdown[zset_score]:0
    memtable_count_limit_stop[zset_score]:0
    estimate_keys[pubsub]:0
    block_cache_usage[pubsub]:432
    block_cache_pinned_usage[pubsub]:0
    index_and_filter_cache_usage[pubsub]:0
    level0_file_limit_slowdown[pubsub]:0
    level0_file_limit_stop[pubsub]:0
    pending_compaction_bytes_slowdown[pubsub]:0
    pending_compaction_bytes_stop[pubsub]:0
    memtable_count_limit_slowdown[pubsub]:0
    memtable_count_limit_stop[pubsub]:0
    estimate_keys[propagate]:0
    block_cache_usage[propagate]:0
    block_cache_pinned_usage[propagate]:0
    index_and_filter_cache_usage[propagate]:0
    level0_file_limit_slowdown[propagate]:0
    level0_file_limit_stop[propagate]:0
    pending_compaction_bytes_slowdown[propagate]:0
    pending_compaction_bytes_stop[propagate]:0
    memtable_count_limit_slowdown[propagate]:0
    memtable_count_limit_stop[propagate]:0
    all_mem_tables:7343776
    cur_mem_tables:7343776
    snapshots:0
    num_immutable_tables:0
    num_running_flushes:0
    memtable_flush_pending:0
    compaction_pending:1
    num_running_compactions:0
    num_live_versions:5
    num_superversion:7
    num_background_errors:0
    flush_count:0
    compaction_count:2
    put_per_sec:0
    get_per_sec:0
    seek_per_sec:0
    next_per_sec:0
    prev_per_sec:0
    is_bgsaving:no
    is_compacting:no
    
    127.0.0.1:6666> set ttt 1
    OK
    127.0.0.1:6666> get ttt
    "1"
    127.0.0.1:6666> select 2
    OK
    127.0.0.1:6666[2]> get ttt
    "1"
    
  • [BUG] Incorrect data after SLAVEOF

    [BUG] Incorrect data after SLAVEOF

    Describe the bug After SLAVEOF, 2 instances can contain different values for a given key.

    To Reproduce Start 2 kvrocks instances and execute the following commands in the respective instances.

    • SERVER2: SLAVEOF SERVER1
    • SERVER2: SLAVEOF NO ONE
    • SERVER2: SET test 222
    • SERVER1: SET test 111
    • SERVER2: SLAVEOF SERVER1
    • SERVER2: GET test
      • Returns "222". However, it should return "111".

    If a new SET command is used on SERVER1, SERVER2 immediately picks up the latest value. This issue doesn't occur if, on the "test" key, SERVER1 executed multiple SET commands while SERVER2 was not a slave.

    Expected behavior After SLAVEOF command, SERVER2 should always contain identical data to SERVER1.

  • [BUG] It is wrong to rewrite config `rename-command` and lead kvrocks to fail to restart

    [BUG] It is wrong to rewrite config `rename-command` and lead kvrocks to fail to restart

    Describe

    If your kvrocks config file has multiple rename-command, kvrocks would generate duplicate configuration items after executing config rewrite, whatever automatically or manually, and leads kvrocks to fail to restart.

    It is introduced in #272

    one example

    rename-command debug                               290033_dont_run_debug_rudely
    rename-command bgsave                              290033_dont_run_bgsave_rudely
    rename-command shutdown                            290033_dont_run_shutdown_rudely
    rename-command keys                                290033_dont_run_keys_rudely
    rename-command debug                               290033_dont_run_debug_rudely
    

    there are two debug rename-commands, so there will be the following error logs.

    * Failed to load config, err: at line: #L19, err: No such command in rename-command
    

    How to fix

    • you can find the duplicate configuration items, and remove duplicate items, only keep one remame-command for one command.
    • of course, you can cherry-pick this commit https://github.com/KvrocksLabs/kvrocks/commit/6c8534a17f056f06faa09bfeada3f92df686975a (#429 )
    • use 2.0.6 version (coming soon)
  • CMake: support ninja as a build backend

    CMake: support ninja as a build backend

    Close #621.

    Benchmark between make and ninja build for kvrocks can be found in #625. TL;DR: The benchmark shows that ninja is slightly slower than make build in clean build, but has huge advantages in incremental build, which is very friendly to kvrocks developers who need to do frequent incremental builds.

    So in this PR, kvrocks still use make by default, but the problem that blocks ninja backend to successfully build in cmake is fixed and now build.sh has a --ninja option to enable ninja.

  • Enhancement: More user-friendly error message

    Enhancement: More user-friendly error message

    Search before asking

    • [X] I had searched in the issues and found no similar issues.

    Motivation

    I get two kinds of error messages when I exec kvrock2redis like this:

    • if the data-dir in config file is an unexist path, it shows Failed to load config, err: NotFound:
    • if the config file is not found, it shows Failed to load config, err: No such file or directory

    I think it need a more accurate error message to distinguish this two cases.

    Solution

    Maybe the simpliest way to solve this problem is to append + data_dir after s.ToString(): https://github.com/apache/incubator-kvrocks/blob/c391953f92fc03b4d22e100a42024a898f3fae47/tools/kvrocks2redis/config.cc#L143

    Are you willing to submit a PR?

    • [ ] I'm willing to submit a PR!
  • Wrongly parsed the RESP empty/null array

    Wrongly parsed the RESP empty/null array

    Search before asking

    • [X] I had searched in the issues and found no similar issues.

    Version

    b1eb17f0228b40244694b308639a8876c90444ba

    Minimal reproduce step

    According to https://redis.io/docs/reference/protocol-spec/#resp-arrays, empty/null array is allowed in RESP but Kvrocks got the protocol error.

    # empty array
    $ echo '*0\r\n*2\r\n$3\r\nget\r\n$3\r\nkey\r\n'|nc 127.0.0.1 6666
    # null array
    $ echo '*-1\r\n*2\r\n$3\r\nget\r\n$3\r\nkey\r\n'|nc 127.0.0.1 6666
    

    What did you expect to see?

    Kvrocks can parse those protocol correctly and response the right value of the key like Redis behavior:

    ❯ echo '*0\r\n*2\r\n$3\r\nget\r\n$3\r\nkey\r\n'|nc 127.0.0.1 6379                                                                                                  
    $-1
    
    ❯ echo '*-1\r\n*2\r\n$3\r\nget\r\n$3\r\nkey\r\n'|nc 127.0.0.1 6379                                                                                                 
    $-1
    

    What did you see instead?

    ❯ echo '*0\r\n*2\r\n$3\r\nget\r\n$3\r\nkey\r\n'|nc 127.0.0.1 6666                                                                                                  
    -Protocol error: expected '$'
    
    ❯ echo '*-1\r\n*2\r\n$3\r\nget\r\n$3\r\nkey\r\n'|nc 127.0.0.1 6666                                                                                                 
    -Protocol error: invalid multibulk length
    

    Anything Else?

    For the empty array case, Kvrocks should NOT enter the next state when the multi bulk length is 0 at line:redis_request.cc#L71

    For the null array case, Kvrocks should use stoll to parse the number instead of stoull since the length maybe negative at line: redis_request.cc#L62. Also, we need to skip the null array like the empty array case.

    Are you willing to submit a PR?

    • [ ] I'm willing to submit a PR!
  • Refactor daily CI configuration using matrix

    Refactor daily CI configuration using matrix

    • solve https://github.com/apache/incubator-kvrocks/pull/626#issuecomment-1154655734 found by @ShooterIT
    • add pull_request trigger proposed by @tisonkun in https://github.com/apache/incubator-kvrocks/pull/626#issuecomment-1154664953
    • refactor the daily CI using a unified matrix instead of some repeated jobs
  • Enhancement: Support GitHub mirrors in CMake build configurations

    Enhancement: Support GitHub mirrors in CMake build configurations

    Search before asking

    • [X] I had searched in the issues and found no similar issues.

    Motivation

    GitHub has some access issues in some countries (connection resets or slow speeds), so we can support custom URL of dependencies in CMake configurations, such as ghproxy.com, which will speed up build procedure, e.g. ./build.sh build -DGITHUB_PROXY=https://ghproxy.com.

    NOTICE: we may need to add SHA verification of fetched files to ensure that users are not vulnerable to MITM attacks by public proxy providers if we decide to add this feature.

    Solution

    No response

    Are you willing to submit a PR?

    • [X] I'm willing to submit a PR!
  • Add clang tidy for static analysis

    Add clang tidy for static analysis

    Search before asking

    • [X] I had searched in the issues and found no similar issues.

    Motivation

    Clang tidy is a static analysis tool based on libclang, which itself is able to match problematic code patterns at the AST level. Its power lies in the ability to directly call checkers in Clang StaticAnalyzer that perform basic symbolic execution and constraint solving on the control flow graph converted directly from the Clang AST.

    This allows clang tidy to check both code smell and some code safety issues such as memory leaks, null pointer dereferences or double frees in a more precise way (than cppcheck, cpplint, etc.). The full set of checkers in clang tidy can be viewed here: https://clang.llvm.org/extra/clang-tidy/checks/list.html.

    Solution

    No response

    Are you willing to submit a PR?

    • [X] I'm willing to submit a PR!
  • [NEW] add lz4 lib

    [NEW] add lz4 lib

    Search before asking

    • [X] I had searched in the issues and found no similar issues.

    Motivation

    KVrocks not included lz4 lib for lz4 compresssion. Only snappy is not enough,lz4 is a efficient algorithm.

    https://user-images.githubusercontent.com/52393536/168716155-82a51edf-74df-48e5-b047-f4e05a192719.png

    Solution

    1. Add lz4 lib into build file.
    2. Add conf for rocksdb.compression "lz4"

    Are you willing to submit a PR?

    • [X] I'm willing to submit a PR!
RocksDB: A Persistent Key-Value Store for Flash and RAM Storage

RocksDB is developed and maintained by Facebook Database Engineering Team. It is built on earlier work on LevelDB

Jun 20, 2022
KVDK (Key-Value Development Kit) is a key-value store library implemented in C++ language

KVDK (Key-Value Development Kit) is a key-value store library implemented in C++ language. It is designed for persistent memory and provides unified APIs for both volatile and persistent scenarios. It also demonstrates several optimization methods for high performance with persistent memory. Besides providing the basic APIs of key-value store, it offers several advanced features, like transaction, snapshot as well.

Jun 17, 2022
RediSearch is a Redis module that provides querying, secondary indexing, and full-text search for Redis.
RediSearch is a Redis module that provides querying, secondary indexing, and full-text search for Redis.

A query and indexing engine for Redis, providing secondary indexing, full-text search, and aggregations.

Jun 17, 2022
🥑 ArangoDB is a native multi-model database with flexible data models for documents, graphs, and key-values. Build high performance applications using a convenient SQL-like query language or JavaScript extensions.
🥑 ArangoDB is a native multi-model database with flexible data models for documents, graphs, and key-values. Build high performance applications using a convenient SQL-like query language or JavaScript extensions.

?? ArangoDB is a native multi-model database with flexible data models for documents, graphs, and key-values. Build high performance applications using a convenient SQL-like query language or JavaScript extensions.

Jun 24, 2022
Scylla is the real-time big data database that is API-compatible with Apache Cassandra and Amazon DynamoDB

Scylla is the real-time big data database that is API-compatible with Apache Cassandra and Amazon DynamoDB. Scylla embraces a shared-nothing approach that increases throughput and storage capacity to realize order-of-magnitude performance improvements and reduce hardware costs.

Jun 24, 2022
Nebula Graph is a distributed, fast open-source graph database featuring horizontal scalability and high availability
Nebula Graph is a distributed, fast open-source graph database featuring horizontal scalability and high availability

Nebula Graph is an open-source graph database capable of hosting super large-scale graphs with billions of vertices (nodes) and trillions of edges, with milliseconds of latency. It delivers enterprise-grade high performance to simplify the most complex data sets imaginable into meaningful and useful information.

Jun 24, 2022
FEDB is a NewSQL database optimised for realtime inference and decisioning application
FEDB is a NewSQL database optimised for realtime inference and decisioning application

FEDB is a NewSQL database optimised for realtime inference and decisioning applications. These applications put real-time features extracted from multiple time windows through a pre-trained model to evaluate new data to support decision making. Existing in-memory databases cost hundreds or even thousands of milliseconds so they cannot meet the requirements of inference and decisioning applications.

Jun 16, 2022
The MongoDB Database

The MongoDB Database

Jun 18, 2022
Kvrocks is a distributed key value NoSQL database based on RocksDB and compatible with Redis protocol.
Kvrocks is a distributed key value NoSQL database based on RocksDB and compatible with Redis protocol.

Kvrocks is a distributed key value NoSQL database based on RocksDB and compatible with Redis protocol.

Jun 24, 2022
RocksDB: A Persistent Key-Value Store for Flash and RAM Storage

RocksDB is developed and maintained by Facebook Database Engineering Team. It is built on earlier work on LevelDB

Jun 20, 2022
KVDK (Key-Value Development Kit) is a key-value store library implemented in C++ language

KVDK (Key-Value Development Kit) is a key-value store library implemented in C++ language. It is designed for persistent memory and provides unified APIs for both volatile and persistent scenarios. It also demonstrates several optimization methods for high performance with persistent memory. Besides providing the basic APIs of key-value store, it offers several advanced features, like transaction, snapshot as well.

Jun 17, 2022
RediSearch is a Redis module that provides querying, secondary indexing, and full-text search for Redis.
RediSearch is a Redis module that provides querying, secondary indexing, and full-text search for Redis.

A query and indexing engine for Redis, providing secondary indexing, full-text search, and aggregations.

Jun 17, 2022
redis-cpp is a header-only library in C++17 for Redis (and C++11 backport)

redis-cpp - lightweight C++ client library for Redis redis-cpp is a C++17 library for executing Redis commands with support for pipelines and the publ

Jun 7, 2022
libmdbx is an extremely fast, compact, powerful, embedded, transactional key-value database, with permissive license
libmdbx is an extremely fast, compact, powerful, embedded, transactional key-value database, with permissive license

One of the fastest embeddable key-value ACID database without WAL. libmdbx surpasses the legendary LMDB in terms of reliability, features and performance.

Apr 13, 2022
A redis module, similar to redis zset, but you can set multiple scores for each member to support multi-dimensional sorting

TairZset: Support multi-score sorting zset Introduction Chinese TairZset is a data structure developed based on the redis module. Compared with the na

Jun 15, 2022
An Embedded NoSQL, Transactional Database Engine

UnQLite - Transactional Embedded Database Engine

Jun 23, 2022
Jun 16, 2022
Kreon is a key-value store library optimized for flash-based storage
Kreon is a key-value store library optimized for flash-based storage

Kreon is a key-value store library optimized for flash-based storage, where CPU overhead and I/O amplification are more significant bottlenecks compared to I/O randomness.

Jun 10, 2022
An efficient, small mobile key-value storage framework developed by WeChat. Works on Android, iOS, macOS, Windows, and POSIX.
An efficient, small mobile key-value storage framework developed by WeChat. Works on Android, iOS, macOS, Windows, and POSIX.

中文版本请参看这里 MMKV is an efficient, small, easy-to-use mobile key-value storage framework used in the WeChat application. It's currently available on Andr

Jun 16, 2022
Simple constant key/value storage library, for read-heavy systems with infrequent large bulk inserts.

Sparkey is a simple constant key/value storage library. It is mostly suited for read heavy systems with infrequent large bulk inserts. It includes bot

Jun 19, 2022