rust-rocksdb

Build Status

This library has been tested against RocksDB 3.8.1 on linux and OSX. The 0.0.7 crate should work with the Rust nightly release as of 7/16/15.

status

Feedback and pull requests welcome! If a particular feature of RocksDB is important to you, please let me know by opening an issue, and I'll prioritize it.

Prerequisite: RocksDB

bash wget https://github.com/facebook/rocksdb/archive/rocksdb-3.8.tar.gz tar xvf rocksdb-3.8.tar.gz && cd rocksdb-rocksdb-3.8 && make shared_lib sudo make install

Running

Cargo.toml

rust [dependencies] rocksdb = "~0.0.7"

Code

```rust extern crate rocksdb; use rocksdb::RocksDB;

fn main() { let mut db = RocksDB::opendefault("/path/for/rocksdb/storage").unwrap(); db.put(b"my key", b"my value"); db.get(b"my key") .map( |value| { println!("retrieved value {}", value.toutf8().unwrap()) }) .onabsent( || { println!("value not found") }) .onerror( |e| { println!("operational problem encountered: {}", e) });

db.delete(b"my key");

} ```

Doing an atomic commit of several writes

```rust extern crate rocksdb; use rocksdb::{RocksDB, WriteBatch, Writable};

fn main() { // NB: db is automatically freed at end of lifetime let mut db = RocksDB::open_default("/path/for/rocksdb/storage").unwrap(); { let mut batch = WriteBatch::new(); // WriteBatch and db both have trait Writable batch.put(b"my key", b"my value"); batch.put(b"key2", b"value2"); batch.put(b"key3", b"value3"); db.write(batch); // Atomically commits the batch } } ```

Getting an Iterator

```rust extern crate rocksdb; use rocksdb::{RocksDB, Direction};

fn main() { // NB: db is automatically freed at end of lifetime let mut db = RocksDB::opendefault("/path/for/rocksdb/storage").unwrap(); let mut iter = db.iterator(); for (key, value) in iter.fromstart() { // Always iterates forward println!("Saw {} {}", key, value); //actually, need to convert [u8] keys into Strings } for (key, value) in iter.from_end() { //Always iterates backward println!("Saw {} {}", key, value); } for (key, value) in iter.from(b"my key", Direction::forward) { // From a key in Direction::{forward,reverse} println!("Saw {} {}", key, value); } } ```

Getting an Iterator

```rust extern crate rocksdb; use rocksdb::{RocksDB, Direction};

fn main() { // NB: db is automatically freed at end of lifetime let mut db = RocksDB::open_default("/path/for/rocksdb/storage").unwrap(); let snapshot = db.snapshot(); // Creates a longer-term snapshot of the DB, but freed when goes out of scope let mut iter = snapshot.iterator(); // Make as many iterators as you'd like from one snapshot } ```

Rustic Merge Operator

```rust extern crate rocksdb; use rocksdb::{RocksDBOptions, RocksDB, MergeOperands};

fn concatmerge(newkey: &[u8], existingval: Option<&[u8]>, operands: &mut MergeOperands) -> Vec { let mut result: Vec = Vec::withcapacity(operands.sizehint().0); existingval.map(|v| { result.extend(v) }); for op in operands { result.extend(op); } result }

fn main() { let path = "/path/to/rocksdb"; let opts = RocksDBOptions::new(); opts.createifmissing(true); opts.addmergeoperator("test operator", concatmerge); let mut db = RocksDB::open(opts, path).unwrap(); let p = db.put(b"k1", b"a"); db.merge(b"k1", b"b"); db.merge(b"k1", b"c"); db.merge(b"k1", b"d"); db.merge(b"k1", b"efg"); let r = db.get(b"k1"); assert!(r.unwrap().toutf8().unwrap() == "abcdefg"); } ```

Apply Some Tunings

Please read the official tuning guide, and most importantly, measure performance under realistic workloads with realistic hardware. ```rust use rocksdb::{RocksDBOptions, RocksDB, newbloomfilter}; use rocksdb::RocksDBCompactionStyle::RocksDBUniversalCompaction;

fn tunedforsomebodyelsesdisk() -> RocksDB { let path = "rustrocksdboptimizetest"; let opts = RocksDBOptions::new(); opts.createifmissing(true); opts.setblocksize(524288); opts.setmaxopenfiles(10000); opts.setusefsync(false); opts.setbytespersync(8388608); opts.setdisabledatasync(false); opts.setblockcachesizemb(1024); opts.settablecachenumshardbits(6); opts.setmaxwritebuffernumber(32); opts.setwritebuffersize(536870912); opts.settargetfilesizebase(1073741824); opts.setminwritebuffernumbertomerge(4); opts.setlevelzerostopwritestrigger(2000); opts.setlevelzeroslowdownwritestrigger(0); opts.setcompactionstyle(RocksDBUniversalCompaction); opts.setmaxbackgroundcompactions(4); opts.setmaxbackgroundflushes(4); opts.setfilterdeletes(false); opts.setdisableauto_compactions(true);

let filter = new_bloom_filter(10);
opts.set_filter(filter);

RocksDB::open(opts, path).unwrap()

} ```