Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/tonivade/claudb
ClauDB is a REDIS implementation in Java
https://github.com/tonivade/claudb
embedded integration-testing java key-value lua master-slave netty4 redis rxjava
Last synced: 4 days ago
JSON representation
ClauDB is a REDIS implementation in Java
- Host: GitHub
- URL: https://github.com/tonivade/claudb
- Owner: tonivade
- License: mit
- Created: 2015-05-15T06:03:07.000Z (over 9 years ago)
- Default Branch: master
- Last Pushed: 2024-12-31T09:32:07.000Z (12 days ago)
- Last Synced: 2025-01-01T04:04:56.062Z (11 days ago)
- Topics: embedded, integration-testing, java, key-value, lua, master-slave, netty4, redis, rxjava
- Language: Java
- Homepage:
- Size: 3.22 MB
- Stars: 174
- Watchers: 11
- Forks: 31
- Open Issues: 10
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# ClauDB
ClauDB is a REDIS implementation in Java. At the moment is in development and only implements a small
subset of commands and features. The objetive is implement a full functional one-to-one replacement
for REDIS (2.8 branch).You will probably wonder why I do this, the answer is I do it Just For Fun.
## Why ClauDB?
Initially I called this project TinyDB, but there's another project with the same name, so, I've
decided to chage to ClaudDB.Clau is :key: in Valencià, a language spoken in eastern Spain, and ClauDB is a key-value database.
## Implemented commands
Server
- FLUSHDB
- INFO
- TIME
- SYNC
- SLAVEOF
- ROLEConnection
- ECHO
- PING
- QUIT
- SELECTKey
- DEL
- EXISTS
- KEYS
- RENAME
- TYPE
- EXPIRE
- PERSIST
- TTL
- PTTLString
- APPEND
- DECRBY
- DECR
- GET
- GETSET
- INCRBY
- INCR
- MGET
- MSET
- MSETNX
- SET (with NX, PX, NX and XX options)
- SETEX
- SETNX
- STRLENHash
- HDEL
- HEXISTS
- HGETALL
- HGET
- HKEYS
- HLEN
- HMGET
- HMSET
- HSET
- HVALSList
- LPOP
- LPUSH
- LINDEX
- LLEN
- LRANGE
- LSET
- RPOP
- RPUSHSet
- SADD
- SCARD
- SDIFF
- SINTER
- SISMEMBER
- SMEMBERS
- SPOP
- SRANDMEMBER
- SREM
- SUNIONSorted Set
- ZADD
- ZCARD
- ZRANGEBYSCORE
- ZRANGE
- ZREM
- ZREVRANGE
- ZINCRBYPub/Sub
- SUBSCRIBE
- UNSUBSCRIBE
- PSUBSCRIBE
- PUNSUBSCRIBE
- PUBLISHTransactions
- MULTI
- EXEC
- DISCARDScripting
- EVAL
- EVALSHA
- SCRIPT LOAD
- SCRIPT EXISTS
- SCRIPT FLUSH## Design
ClauDB is implemented using Java8. Is single thread, like REDIS. It uses asynchronous IO
(netty) and reactive programing paradigm (rxjava).Requests come from IO threads and enqueues to rxjava single thread scheduler. Then IO thread is free
to process another request. When request is done, the response is sended to client asyncronously. Then,
every request is managed one by one, in a single thread, so there's no concurrency issues to care
about.## Features
Now only implements a subset of REDIS commands, but is usable.
~~ClauDB also supports persistence compatible with REDIS, RDB dumps and AOF journal. It can create
compatible RDB files you can load in a REDIS server.~~ Removed since 2.0 versionNow ClauDB support master/slave replication, a master can have multiple slaves, but at the moment
slaves can't have slaves.Also implements partially the Pub/Sub subsystem.
## Changes in 2.0 version
The RDB file format support has been dropped and replaced with h2 [MVStore](http://www.h2database.com/html/mvstore.html).
This allows ClauDB to have file persistence and off heap memory support.
Another important change, now ClauDB has been splited in several subprojects:
- claudb-lib: implementation of the server and commands.
- claudb-app: command line application to run standalone server and client.
- claudb-junit4: implements a Junit4 compatible @Rule to use in junit4 based tests. [Example](https://github.com/tonivade/claudb/blob/master/junit4/src/test/java/com/github/tonivade/claudb/junit4/TestJunit4Rule.java)
- claudb-junit5: implements a Junit5 compatible extension to use in junit5 based tests. [Example](https://github.com/tonivade/claudb/blob/master/junit5/src/test/java/com/github/tonivade/claudb/junit5/TestJunit5Extension.java)## Performance
Performance is quite good, not as good as REDIS, but it's good enough for Java.
This is ClauDB
$ redis-benchmark -t set,get -h localhost -p 7081 -n 100000 -q
SET: 82576.38 requests per second, p50=0.303 msec
GET: 93896.71 requests per second, p50=0.287 msec
And this is REDIS$ redis-benchmark -t set,get -h localhost -p 6379 -n 100000 -q
SET: 148148.14 requests per second, p50=0.167 msec
GET: 147710.48 requests per second, p50=0.175 msec
In my laptop (Intel Core i7-1065G7, with 32G of RAM, running linux)## BUILD
You need to clon the repo:
$ git clone https://github.com/tonivade/claudb.git
ClauDB uses Gradle as building tool, but you don't need Gradle installed, just type:
$ ./gradlew build
This scripts automatically download Gradle and then runs the tasks.
Or if you have Gradle installed, just type
$ gradle build
Create all-in-one jar$ ./gradlew fatJar
## DOCKER
You can create your own docker images for ClauDB using the provided `Dockerfile`
$ docker build -t claudb .
And then run the image
$ docker run -p 7081:7081 claudb
## USAGE
You can start a new server listening in default port 7081.
$ wget https://repo1.maven.org/maven2/com/github/tonivade/claudb-app/2.0.1/claudb-app-2.0.1-all.jar
$ java -jar claudb-2.0.1-all.jaror using [jgo](https://github.com/scijava/jgo) utility
$ jgo com.github.tonivade:claudb-app:2.0.1:com.github.tonivade.claudb.Server
Parameters:Option Description
------ -----------
-N enable keyspace notifications (experimental)
-O enable off heap memory (experimental)
-P [String: file name] enable persistence (experimental) (default: ./claudb.data)
-V verbose mode
-h define listen host (default: localhost)
--help print help
-p define listen port (default: 7081)Also you can use inside your project using Maven
com.github.tonivade
claudb
2.0.1
Or gradlecompile 'com.github.tonivade:claudb:2.0.1'
Or embed in your source code
```java
RespServer server = ClauDB.builder().host("localhost").port(7081).build();
server.start();
```## Native Image
Now is possible to generate a native image thanks to graalvm. You can generate one with this command:
```shell
$ ./gradlew clean nativeImage
```Some features are not available like lua runtime and offheap memory.
## TODO
- Ziplist and Maplist encoding not implemented yet.
- Master/Slave replication improvements. Slave with Slaves
- Partitioning?
- Clustering?
- Geo Commands## Continuous Integration
[![Java CI with Gradle](https://github.com/tonivade/claudb/actions/workflows/gradle.yml/badge.svg)](https://github.com/tonivade/claudb/actions/workflows/gradle.yml)
[![Codacy Badge](https://api.codacy.com/project/badge/Grade/63af79474b40420da97b36d02972f302)](https://www.codacy.com/app/tonivade/claudb?utm_source=github.com&utm_medium=referral&utm_content=tonivade/claudb&utm_campaign=Badge_Grade)
[![Codacy Badge](https://api.codacy.com/project/badge/Coverage/63af79474b40420da97b36d02972f302)](https://www.codacy.com/app/tonivade/claudb?utm_source=github.com&utm_medium=referral&utm_content=tonivade/claudb&utm_campaign=Badge_Coverage)
[![Maven Central](https://maven-badges.herokuapp.com/maven-central/com.github.tonivade/claudb/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.github.tonivade/claudb)
[![Join the chat at https://gitter.im/tonivade/claudb](https://badges.gitter.im/tonivade/claudb.svg)](https://gitter.im/tonivade/claudb?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)## Stargazers over time
[![Stargazers over time](https://starchart.cc/tonivade/claudb.svg)](https://starchart.cc/tonivade/claudb)
## LICENSE
ClauDB is released under MIT License