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
  • Implement the data structure and partial commands of the Redis stream

    Implement the data structure and partial commands of the Redis stream

    Available commands:

    • XADD
    • XDEL
    • XINFO STREAM
    • XLEN
    • XRANGE
    • XREAD
    • XREVRANGE
    • XTRIM

    Design notes Link to the Redis data type description: https://redis.io/docs/manual/data-types/streams/ A stream is a sequence of entries. Each entry has a unique ID in the form "1-2" where two 64-bit numbers are divided by a hyphen. By default, the first number is set to a millisecond timestamp, and the second one is a so-called sequence number - for cases when more than one entry was added at the same millisecond. The value of an entry is a set of key-value pairs. In case of the command: XADD s1 1-0 key1 val1 key2 val2 the ID is 1-0 and the value is key1 val1 key2 val2. In RocksDB entries are represented as key-value pairs where the key is formed as: key | version | entry-ID-milliseconds-value | entry-ID-sequence-number-value and the value is encoded as: key1-length(fixed-32) | key1 | val1-length(fixed-32) | val1 | key2-length(fixed-32) | key2 | val2-length(fixed-32) | val2. Thanks to the structure of a key, all entries in a stream are sorted in chronological order. As for value decoding: this is the first idea that came to my mind and maybe it's not very efficient because has an overhead (4 bytes on every argument). Why did I introduce such a weird encoding scheme? Because if you are reading entries, Redis responds not with a single string:

    1) 1) "s1"
       2) 1) 1) "1-0"
             2) 1) "key1"
                2) "val1"
                3) "key2"
                4) "val2"
    

    Perhaps, command args can be joined with a ' '(space) into a single string and this string should be saved in RocksDB? After reading, it will be split while constructing the reponse. With this encoding scheme, I was thinking about the possible spaces inside arguments and how to deal with them?

    Differences from Redis

    1. XTRIM and XADD with trim possibility: nearly exact trimming (via ~) is not possible due to implementation details (no radix tree here). However, LIMIT option is working while in Redis it is allowed only in combination with ~. LIMIT can be disallowed to be consistent with Redis protocol. I didn't do that because I want to hear opinions from kvrocks maintainers.

    Replication is not implemented yet. Basically, I didn't test streams in a cluster configuration. Perhaps, the plain XREAD on a replica will work, but blocking XREAD that unblocks after XADD on the master - I'm sure that some code should be written. It would be greatly appreciated if maintainers provide me with some hints about how to implement this.

    Consumer groups are not implemented. I'm thinking about the possible implementation.

    Right now I'm looking for any maintainers' feedback from the adding-new-data-type perspective (maybe, I didn't add a new column family to some filter/checker/extractor, etc.) and information about proper replicating a stream from master to other nodes.

    This closes #532

  • Flaky test on expire precision

    Flaky test on expire precision

    Search before asking

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

    Version

    https://github.com/apache/incubator-kvrocks/pull/981/commits/461d0e8cc95cf959df50db2d75fecffbfd919875

    Minimal reproduce step

    Flaky test on CI env.

    What did you expect to see?

    Tests passed.

    What did you see instead?

    --- FAIL: TestString (12.24s)
        --- FAIL: TestString/GETEX_EXAT_option (0.00s)
            assertions.go:36: 
                	Error Trace:	/home/runner/work/incubator-kvrocks/incubator-kvrocks/tests/gocase/unit/type/strings/assertions.go:36
                	            				/home/runner/work/incubator-kvrocks/incubator-kvrocks/tests/gocase/unit/type/strings/strings_test.go:155
                	Error:      	"11s" is not less than or equal to "10s"
                	Test:       	TestString/GETEX_EXAT_option
        --- FAIL: TestString/GETEX_PXAT_option (0.00s)
            assertions.go:36: 
                	Error Trace:	/home/runner/work/incubator-kvrocks/incubator-kvrocks/tests/gocase/unit/type/strings/assertions.go:36
                	            				/home/runner/work/incubator-kvrocks/incubator-kvrocks/tests/gocase/unit/type/strings/strings_test.go:162
                	Error:      	"11s" is not less than or equal to "10s"
                	Test:       	TestString/GETEX_PXAT_option
    

    Anything Else?

    cc @git-hulk please take a look.

    Are you willing to submit a PR?

    • [ ] I'm willing to submit a PR!
  • [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.

  • ✨ feat: luajit replace lua

    ✨ feat: luajit replace lua

    1. Luajit replace lua
    2. rm test case "cmsgpack can pack and unpack circular references". Becase luajit's core code diffrent from lua. Also, different compilers produce different code execution effects (GCC&clang on Ubuntu).
  • Add `StatusOr` for error handling in modern C++ style

    Add `StatusOr` for error handling in modern C++ style

    In kvrocks we use a style like Status process(input..., T* output) to handle errors. It works well, but in C++ we can do better via constructing type-safe union types.

    In this PR, we propose a new class template StatusOr<T>, which contains EITHER a value typed T OR an error status. Here is a simple example:

    StatusOr<std::string> hello(std::string x) {
      if (x.size() > 10) {
        return {Status::NotOK, "string too long"}; // returns an error
      }
    
      return x + " hello"; // returns a value (no error occurred)
    };
    
    StatusOr<std::string> hi(std::string x) {
      if (x.size() < 5) {
        return {Status::NotOK, "string too short"};
      }
    
      auto res = hello(x); // call `hello` which returns `StatusOr`
      if (!res) return res; // forward error status
    
      return "hi " + *res; // use it via deref
    };
    
    assert(*hi("twice") == "hi twice hello");
    
    auto s = hi("x");
    assert(!s && s.Msg() == "string too short"); // s has no value now
    
    auto l = hi("xxxxxxxxxxx");
    assert(!l && l.Msg() == "string too long");
    

    We maximize the use of move semantics in C++ to eliminate redundant copies and optimize the storage, so that developers do not need to worry too much about its performance when using it.

  • Add TLS support for kvrocks connections

    Add TLS support for kvrocks connections

    We bring TLS support for kvrocks, referring to redis TLS.

    TODO:

    • [x] conditional compilation
    • [x] more friendly error messages
    • [x] more options for SSL cert/key/cacert and ciphers
    • [x] thread safety for openssl and eventbuffer
    • [x] hot-reload tls options
    • [x] tests

    temporarily not in plan (of this PR):

    • tls for replication

    Why do we use shared library of OpenSSL and do not pin the version of OpenSSL?

    OpenSSL contains many cryptographic algorithms and implementations of the TLS protocol, which are security-critical. We hope that users will be able to quickly update the OpenSSL that kvrocks depends on to a new version in the event of a serious security vulnerability in OpenSSL (In fact OpenSSL has had several serious security incidents). If static linking is used, users may need to modify the cmake file and recompile, and kvrocks developers also need to always pay attention to the security vulnerabilities of OpenSSL and maintain version of cmake dependencies, which is very troublesome.


    Supported options:

    • tls_port
    • tls_cert_file
    • tls_key_file
    • tls_key_file_pass
    • tls_ca_cert_file
    • tls_ca_cert_dir
    • tls_auth_clients
    • tls_prefer_server_ciphers
    • tls_ciphers
    • tls_ciphersuites
    • tls_protocols
    • tls_session_caching
    • tls_session_cache_size
    • tls_session_cache_timeout
  • 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.

  • Fix redis cli test will fail if cannot read response at once

    Fix redis cli test will fail if cannot read response at once

    This closes #1072

    For the current read implementation, it will return the string after reading the response, so it may only read parts of the response. We simply fix it by checking whether the response string has the newline('\n') or not.

  • Increase blocking timeout to harden the blocking pop test case

    Increase blocking timeout to harden the blocking pop test case

    close #1126

    Currently, the blocking pop with the empty argument may fail if took a long time(more than 1s) to execute the RPUSH command. The leading cause is the previous BRPOP command would get the empty bulk string($-1\r\n) instead of the element array when it's timed out.

  • Unstable Go case list_test

    Unstable Go case list_test

    Search before asking

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

    Motivation

    https://github.com/apache/incubator-kvrocks/actions/runs/3476132400/jobs/5811155755

    --- FAIL: TestList (6.74s)
        --- FAIL: TestList/brpop:_arguments_are_empty (1.00s)
            tcp_client.go:79: 
                	Error Trace:	/home/runner/work/incubator-kvrocks/incubator-kvrocks/tests/gocase/unit/type/list/tcp_client.go:79
                	            				/home/runner/work/incubator-kvrocks/incubator-kvrocks/tests/gocase/unit/type/list/list_test.go:435
                	Error:      	Not equal: 
                	            	expected: int32(42)
                	            	actual  : uint8(0x24)
                	Test:       	TestList/brpop:_arguments_are_empty
    

    Solution

    No response

    Are you willing to submit a PR?

    • [ ] I'm willing to submit a PR!
  • Use core number as the default concurrent compile task number in x.py

    Use core number as the default concurrent compile task number in x.py

    4 is not a good value for default concurrent compile task number.

    In devices which core number is less than 4 (like vm of github actions), it can make the compile time even longer than -j $(nproc) (since there will be more CPU context switching), and if core number is more than 4, it will also take longer than -j $(nproc) in normal situation.

  • Abort due to detaching un-joinable threads in slotmigrate_test

    Abort due to detaching un-joinable threads in slotmigrate_test

    Search before asking

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

    Version

    unstable

    Minimal reproduce step

    https://github.com/apache/incubator-kvrocks/actions/runs/3467209459/jobs/5791922270

    What did you expect to see?

    PASS

    What did you see instead?

    --- FAIL: TestSlotMigrateFromSlave (2.18s)
        server.go:106: 
            	Error Trace:	/home/runner/work/incubator-kvrocks/incubator-kvrocks/tests/gocase/integration/slotmigrate/server.go:106
            	            				/home/runner/work/incubator-kvrocks/incubator-kvrocks/tests/gocase/integration/slotmigrate/server.go:112
            	            				/home/runner/work/incubator-kvrocks/incubator-kvrocks/tests/gocase/integration/slotmigrate/server.go:101
            	            				/home/runner/work/incubator-kvrocks/incubator-kvrocks/tests/gocase/integration/slotmigrate/slotmigrate_test.go:47
            	            				/home/runner/work/incubator-kvrocks/incubator-kvrocks/tests/gocase/integration/slotmigrate/slotmigrate_test.go:65
            	Error:      	Received unexpected error:
            	            	signal: aborted (core dumped)
            	Test:       	TestSlotMigrateFromSlave
    FAIL
    
    E20221115 04:06:34.430215 38266 main.cc:67] ======= Ooops! kvrocks 999.999.999 @7fb3d64 got signal: Aborted (6) =======
    E20221115 04:06:34.439514 38266 main.cc:85] /lib/x86_64-linux-gnu/libpthread.so.0(+0x14420) [0x7f64354c0420]
    E20221115 04:06:34.439740 38266 main.cc:83] /lib/x86_64-linux-gnu/libc.so.6(gsignal+0xcb) [0x7f64351ae00b]                                   gsignal
    E20221115 04:06:34.439891 38266 main.cc:83] /lib/x86_64-linux-gnu/libc.so.6(abort+0x12b) [0x7f643518d859]                                    abort
    E20221115 04:06:34.440196 38266 main.cc:83] /home/runner/work/incubator-kvrocks/incubator-kvrocks/build/kvrocks(+0xe89a9) [0x5557203199a9]   _ZN9__gnu_cxx27__verbose_terminate_handlerEv.cold
    E20221115 04:06:34.441274 38266 main.cc:83] /home/runner/work/incubator-kvrocks/incubator-kvrocks/build/kvrocks(+0x9199bc) [0x555720b4a9bc]  __cxxabiv1::__terminate()
    E20221115 04:06:34.442413 38266 main.cc:85] /home/runner/work/incubator-kvrocks/incubator-kvrocks/build/kvrocks(+0x919a27) [0x555720b4aa27]
    E20221115 04:06:34.443441 38266 main.cc:85] /home/runner/work/incubator-kvrocks/incubator-kvrocks/build/kvrocks(+0x919b89) [0x555720b4ab89]
    E20221115 04:06:34.443967 38266 main.cc:83] /home/runner/work/incubator-kvrocks/incubator-kvrocks/build/kvrocks(+0xea6a0) [0x55572031b6a0]   std::__throw_system_error()
    E20221115 04:06:34.444846 38266 main.cc:83] /home/runner/work/incubator-kvrocks/incubator-kvrocks/build/kvrocks(+0x99e4f0) [0x555720bcf4f0]  std::thread::detach()
    E20221115 04:06:34.445474 38266 main.cc:83] /home/runner/work/incubator-kvrocks/incubator-kvrocks/build/kvrocks(+0x12a8a1) [0x55572035b8a1]  ReplicationThread::Stop()
    E20221115 04:06:34.446453 38266 main.cc:83] /home/runner/work/incubator-kvrocks/incubator-kvrocks/build/kvrocks(+0x1ec8cf) [0x55572041d8cf]  Server::Stop()
    E20221115 04:06:34.446888 38266 main.cc:83] /home/runner/work/incubator-kvrocks/incubator-kvrocks/build/kvrocks(+0x26aec8) [0x55572049bec8]  signalHandler
    E20221115 04:06:34.447082 38266 main.cc:85] /lib/x86_64-linux-gnu/libpthread.so.0(+0x14420) [0x7f64354c0420]
    E20221115 04:06:34.447254 38266 main.cc:83] /lib/x86_64-linux-gnu/libc.so.6(clone+0x35) [0x7f643528a[125](https://github.com/apache/incubator-kvrocks/actions/runs/3467209459/jobs/5791922270#step:13:126)]                                     clone
    

    Anything Else?

    No response

    Are you willing to submit a PR?

    • [ ] I'm willing to submit a PR!
  • Can't start kvrocks in Docker container on macos.

    Can't start kvrocks in Docker container on macos.

    Search before asking

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

    Version

    MacOS version: 12.6, MacBook Pro Apple M1 Max Docker desktop version: 4.12.0 (85629) kvrocks version: latest from Docker hub https://hub.docker.com/layers/apache/kvrocks/latest/images/sha256-9ef819b07e071f03125846c08e01ee4651710f2ee70518987fbaf6944a6e5b62?context=explore

    Minimal reproduce step

    ❯ docker run -it -p 6666:6666 apache/kvrocks
    <jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
    <jemalloc>: (This is the expected behaviour if you are running under QEMU)
    
    ❯ docker ps -a
    CONTAINER ID   IMAGE            COMMAND                  CREATED              STATUS                            PORTS                    NAMES
    2c5f0f887f81   apache/kvrocks   "./bin/kvrocks -c ./…"   About a minute ago   Exited (137) About a minute ago                            
    

    What did you expect to see?

    kvrocks start log.

    What did you see instead?

    <jemalloc>: MADV_DONTNEED does not work (memset will be used instead)
    <jemalloc>: (This is the expected behaviour if you are running under QEMU)
    

    Anything Else?

    No response

    Are you willing to submit a PR?

    • [ ] 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

Nov 25, 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.

Nov 16, 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.

Nov 23, 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.

Nov 17, 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.

Nov 23, 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.

Nov 25, 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.

Nov 22, 2022
The MongoDB Database

The MongoDB Database

Nov 19, 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.

Nov 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

Nov 25, 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.

Nov 16, 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.

Nov 23, 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

Nov 18, 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.

Nov 17, 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

Nov 12, 2022
An Embedded NoSQL, Transactional Database Engine

UnQLite - Transactional Embedded Database Engine

Nov 18, 2022
Nov 13, 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.

Jul 14, 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

Nov 25, 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

Nov 5, 2022