rocksDB 是一个可嵌入的,持久性的 key-value
存储。基于Google的LevelDB,但提高了扩展性可以运行在多核处理器上,可以有效使用快速存储,支持IO绑定、内存和一次写负荷。
它有以下四个特点
高性能:RocksDB使用一套日志结构的数据库引擎,为了更好的性能,这套引擎是用C++编写的。 Key和value是任意大小的字节流。
为快速存储而优化:RocksDB为快速而又低延迟的存储设备(例如闪存或者高速硬盘)而特殊优化处理。 RocksDB将最大限度的发挥闪存和RAM的高度率读写性能。
可适配性:RocksDB适合于多种不同工作量类型。从像MyRocks这样的数据存储引擎,到应用数据缓存,甚至是一些嵌入式工作量,RocksDB都可以从容面对这些不同的数据工作量需求。
基础和高级的数据库操作,RocksDB提供了一些基础的操作,例如打开和关闭数据库。对于合并和压缩过滤等高级操作,也提供了读写支持。
maven
<!-- rocksdb -->
<dependency>
<groupId>org.rocksdb</groupId>
<artifactId>rocksdbjni</artifactId>
<version>5.9.2</version>
</dependency>
完整代码
package org.dreams.transaction.rockDB;
import org.rocksdb.*;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
class RocksJavaTest {
private static final String dbPath = "/Users/weiwei/Documents/rocksdb/java/data/";
static {
RocksDB.loadLibrary();
}
RocksDB rocksDB;
// RocksDB.DEFAULT_COLUMN_FAMILY
public void testDefaultColumnFamily() throws RocksDBException, IOException {
Options options = new Options();
options.setCreateIfMissing(true);
// 文件不存在,则先创建文件
if (!Files.isSymbolicLink(Paths.get(dbPath))) Files.createDirectories(Paths.get(dbPath));
rocksDB = RocksDB.open(options, dbPath);
/**
* 简单key-value
*/
byte[] key = "Hello".getBytes();
byte[] value = "World".getBytes();
rocksDB.put(key, value);
byte[] getValue = rocksDB.get(key);
System.out.println(new String(getValue));
/**
* 通过List做主键查询
*/
rocksDB.put("SecondKey".getBytes(), "SecondValue".getBytes());
List<byte[]> keys = new ArrayList<>();
keys.add(key);
keys.add("SecondKey".getBytes());
Map<byte[], byte[]> valueMap = rocksDB.multiGet(keys);
for (Map.Entry<byte[], byte[]> entry : valueMap.entrySet()) {
System.out.println(new String(entry.getKey()) + ":" + new String(entry.getValue()));
}
/**
* 打印全部[key - value]
*/
RocksIterator iter = rocksDB.newIterator();
for (iter.seekToFirst(); iter.isValid(); iter.next()) {
System.out.println("iter key:" + new String(iter.key()) + ", iter value:" + new String(iter.value()));
}
/**
* 删除一个key
*/
rocksDB.delete(key);
System.out.println("after remove key:" + new String(key));
iter = rocksDB.newIterator();
for (iter.seekToFirst(); iter.isValid(); iter.next()) {
System.out.println("iter key:" + new String(iter.key()) + ", iter value:" + new String(iter.value()));
}
}
public void testCertainColumnFamily() throws RocksDBException {
String table = "CertainColumnFamilyTest";
String key = "certainKey";
String value = "certainValue";
List<ColumnFamilyDescriptor> columnFamilyDescriptors = new ArrayList<>();
Options options = new Options();
options.setCreateIfMissing(true);
List<byte[]> cfs = RocksDB.listColumnFamilies(options, dbPath);
if (cfs.size() > 0) {
for (byte[] cf : cfs) {
columnFamilyDescriptors.add(new ColumnFamilyDescriptor(cf, new ColumnFamilyOptions()));
}
} else {
columnFamilyDescriptors.add(new ColumnFamilyDescriptor(RocksDB.DEFAULT_COLUMN_FAMILY, new ColumnFamilyOptions()));
}
List<ColumnFamilyHandle> columnFamilyHandles = new ArrayList<>();
DBOptions dbOptions = new DBOptions();
dbOptions.setCreateIfMissing(true);
rocksDB = RocksDB.open(dbOptions, dbPath, columnFamilyDescriptors, columnFamilyHandles);
for (int i = 0; i < columnFamilyDescriptors.size(); i++) {
if (new String(columnFamilyDescriptors.get(i).columnFamilyName()).equals(table)) {
rocksDB.dropColumnFamily(columnFamilyHandles.get(i));
}
}
ColumnFamilyHandle columnFamilyHandle = rocksDB.createColumnFamily(new ColumnFamilyDescriptor(table.getBytes(), new ColumnFamilyOptions()));
rocksDB.put(columnFamilyHandle, key.getBytes(), value.getBytes());
byte[] getValue = rocksDB.get(columnFamilyHandle, key.getBytes());
System.out.println("get Value : " + new String(getValue));
rocksDB.put(columnFamilyHandle, "SecondKey".getBytes(), "SecondValue".getBytes());
List<byte[]> keys = new ArrayList<byte[]>();
keys.add(key.getBytes());
keys.add("SecondKey".getBytes());
List<ColumnFamilyHandle> handleList = new ArrayList<>();
handleList.add(columnFamilyHandle);
handleList.add(columnFamilyHandle);
Map<byte[], byte[]> multiGet = rocksDB.multiGet(handleList, keys);
for (Map.Entry<byte[], byte[]> entry : multiGet.entrySet()) {
System.out.println(new String(entry.getKey()) + "--" + new String(entry.getValue()));
}
rocksDB.delete(columnFamilyHandle, key.getBytes());
RocksIterator iter = rocksDB.newIterator(columnFamilyHandle);
for (iter.seekToFirst(); iter.isValid(); iter.next()) {
System.out.println(new String(iter.key()) + ":" + new String(iter.value()));
}
}
public static void main(String[] args) throws Exception {
RocksJavaTest test = new RocksJavaTest();
test.testDefaultColumnFamily();
// test.testCertainColumnFamily();
}
}