RocksDB基于Google的LevelDB,但提高了扩展性可以运行在多核处理器上,可以有效使用快速存储,支持IO绑定、内存和一次写负荷。
其架构如下:
1. 编译RocksJava
首先,需要安装好Java环境。。
其次,去Github下载rocksdb源代码。地址:
https://github.com/facebook/rocksdb.git
然后,用以下命令编译RocksDBJava:
make rocksdbjava
编译完成后,会在rocksdb源代码目录下的java/target/目录下生成2个jar包:rocksdbjni-4.9.0-osx.jar 和 librocksdbjni-osx.jnilib
所有API文档都生成在:target/apidocs/目录下
2. 搭建开发环境
将rocksdbjni-4.9.0-osx.jar放在工程classpath中,librocksdbjni-osx.jnilib需要和rocksdbjni-4.9.0-osx.jar放在同一目录中。
3. 代码示例
package com.test; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.rocksdb.ColumnFamilyDescriptor; import org.rocksdb.ColumnFamilyHandle; import org.rocksdb.ColumnFamilyOptions; import org.rocksdb.DBOptions; import org.rocksdb.Options; import org.rocksdb.RocksDB; import org.rocksdb.RocksDBException; import org.rocksdb.RocksIterator; public class RocksJavaTest { private static final String dbPath = "/Users/xiaolongli/Documents/workspace/rocksdb/rocksdb/java/data/"; static { RocksDB.loadLibrary(); } RocksDB rocksDB; public RocksJavaTest() throws RocksDBException { } // RocksDB.DEFAULT_COLUMN_FAMILY public void testDefaultColumnFamily() throws RocksDBException { Options options = new Options(); options.setCreateIfMissing(true); rocksDB = RocksDB.open(options, dbPath); byte[] key = "Hello".getBytes(); byte[] value = "World".getBytes(); rocksDB.put(key, value); List<byte[]> cfs = RocksDB.listColumnFamilies(options, dbPath); for(byte[] cf : cfs) { System.out.println(new String(cf)); } byte[] getValue = rocksDB.get(key); System.out.println(new String(getValue)); 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())); } 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())); } rocksDB.remove(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.remove(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 RocksDBException { RocksJavaTest test = new RocksJavaTest(); // test.testDefaultColumnFamily(); test.testCertainColumnFamily(); } }