Home

Awesome

Got a question? Ask here: https://groups.google.com/forum/#!forum/boonjava SlumberDB is part of Boon.

Slumber DB - Key Value Store for JSON / REST

The JSON/Java database for REST and Websocket storage.

Boon is the fastest JSON serialization for the JVM. Kryo is the fastest Java serialization for the JVM.

This project marries Boon/Kryo with LevelDB, MySQL, RocksDB, and LMDB to provide simple key/value storage.

The focus is not on data grid usage, but just as a data safe reliable key/value store for Java.

We are at 95% plus code coverage. We care about providing a quality, simple fast storage mechanism with an easy to use interface for Java.

Features

Provide a simple key/value store.

We have an implementation in LevelDB and MySQL for Strings, JSON, serialized Java and binary.

Interface

The main interface(s) for SlumberDB are as follows:


public interface KeyValueStore <K, V> extends Closeable{

    void put(K key, V value);


    void putAll(Map<K, V> values);

    void removeAll(Iterable<K> keys);

    void remove(K key);

    KeyValueIterable<K, V> search(K startKey);

    KeyValueIterable<K, V> loadAll();

    V get(K key);


    void close();

    void flush();

}

The focus is on being a store. There is some rudimentary read operations for faulting in-memory cache operations.

License

SlumberDB is Apache 2.0 license.

Getting Started

Creating a JSON Key/Value store that uses LevelDB



    private JsonKeyValueStore<String, Employee> store;
    
    store = new SimpleJsonKeyValueStoreLevelDB(file.toString(), Employee.class);

Writing employees out to LevelDB

     store.put("123", new Employee("Rick", "Hightower"));

Writing out many employees to LevelDB (using JSON).

        Map<String, Employee> map = Maps.map(

                "123", new Employee("Rick", "Hightower"),
                "456", new Employee("Paul", "Tiger"),
                "789", new Employee("Jason", "Donner")

        );


        store.putAll(map);

Reading an employee from leveldb


        employee = store.get("123");
        Str.equalsOrDie("Rick", employee.getFirstName());
        Str.equalsOrDie("Hightower", employee.getLastName());

Deleting a bunch of employees


        store.removeAll(map.keySet());

Searching for employees with id "key.50"

        KeyValueIterable<String, Employee> entries = store.search("key.50");

Iterating through every key in the key/value store


        KeyValueIterable<String, Employee> entries = store.loadAll();


        for (Entry<String, Employee> entry : entries) {
            puts (entry.key(), entry.value());
        }

Now to do the same as above but use Kryo instead of JSON.

Kryo version


private SimpleKyroKeyValueStoreLevelDB<Employee> store;
store = new SimpleKyroKeyValueStoreLevelDB(file.toString(), Employee.class);

//The rest of the CRUD code is the same except for Employee has to implement serializable

Kyro is the fastest Java binary serialization mechanism for the JVM and it works with iOS and Java. Boon is the fastest JSON serialization mechanism for the JVM, and JSON works everywhere.

Now to do the above again but use MySQL instead of LevelDB.

MySQL and JSON


    private SimpleJsonKeyValueStoreMySQL<Employee> store;
    String url = "jdbc:mysql://localhost:3306/slumberdb";
    String userName = "slumber";
    String password = "slumber7890";
    String table = "json-employee-test";

    ...
    store = new SimpleJsonKeyValueStoreMySQL(url, userName, password, table, Employee.class);
    //The rest of the CRUD code is the same except

MySQL and Kryo


    private SimpleKyroKeyValueStoreMySQL<Employee> store;
    String url = "jdbc:mysql://localhost:3306/slumberdb";
    String userName = "slumber";
    String password = "slumber789";
    String table = "kyro-emp-test";
    
    ...
    ...
    store = new SimpleKyroKeyValueStoreMySQL(url, userName, password, table, Employee.class);

So far we have the following concrete classes:

LevelDB:

I am considering an equal number of Simple stores that use Long as keys. Then beyond that you have to roll your own on top of these.

MySQL:

SlumberDB fits into the BerkerlyDB sort of use case. It is currently meant for embedded sorts of access. SlumberDB will likely support LMDB and RocksDB in short order. Early RocksDB support was started but not complete. I am also considering a wire protocol on top of JSON and Kyro using Vertx, and some replication using Vertx.

Related projects

LevelDB is a lightweight database by Google modeled after BigTable tablet store. LevelDB gets used by Chrome.

RocksDB is a server-side version of LevelDB by Facebook that reportedly is more scalable than LevelDB.

MySQL is well MySQL. We are using it as a table with two columns. One column is indexed.

LMDB is an fast, compact key/value store which gets used by the OpenLDAP Project.

Kryo is the fastest and efficient object graph serialization for the JVM.

See Kryo at: https://github.com/EsotericSoftware/kryo

See Boon at: https://github.com/RichardHightower/org.boon

See LevelDBJNI at: https://github.com/fusesource/leveldbjni

See LevelDB at: https://code.google.com/p/leveldb/

See RocksDB at: http://rocksdb.org/

See RocksDBJNI at: https://github.com/fusesource/rocksdbjni

See LMDB: http://symas.com/mdb/

See LMDBJNI: https://github.com/chirino/lmdbjni

Thanks

Special thanks to Hiram Chirino for writing leveldbjni, lmdbjni and rocksdbjni. Without Hiram, Apache Apollo hero, none of this would be possible.

See Mr. Chirino at: https://github.com/chirino

Special thanks to Tim Fox for writing Vertx. Tim is the author of Vertx which leads the charts for fast JVM based web servers. Vertx is so much more than a web server.

https://github.com/purplefox

We plan on using Vertx for replication and client/server networking support.

http://www.infoq.com/news/2011/12/apollo-benchmarks

Primary Author

Rick Hightower works on JSR-107 and JSR-347 as well as Boon which has an in-memory query engine, and a fast JSON parser/serializer.

Other goals

This is an effort to write key / value stores for JSR-107 RI and one for HazelCast MapStore.

The goals are simple. Write a MySQL, LevelDB, LMDB, and RocksDB key / value store for Java serialization and JSON for HazelCast MapStore and JSR-107 RI Cache Stores.

The MySQL version, for example, will use Boon JSON serialization and kryo.

The plan is to use rocksdbjni and lmdbjni for the LevelDB implementation, and later Vertx for server and replication support.

Currently we support MySQL and LevelDB.

We plan on using Vertx to provide a network interface using Kyro and Boon JSON as well as replication.

The focus is not on data grid usage, but just as a data safe reliable key/value store for Java.