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.
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.
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
rust
[dependencies]
rocksdb = "~0.0.7"
```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");
} ```
```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 } } ```
```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); } } ```
```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 } ```
```rust extern crate rocksdb; use rocksdb::{RocksDBOptions, RocksDB, MergeOperands};
fn concatmerge(newkey: &[u8], existingval: Option<&[u8]>,
operands: &mut MergeOperands) -> Vec
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"); } ```
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()
} ```