English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Instalación y aplicación de RocksDB en Java

rocksDB es unembeddableclave persistente-Almacenamiento de valor.

A continuación, se introduce el contenido de la página web oficial de rocksDB en chino 

https://rocksdb.org.cn/

Tiene los siguientes cuatro características

1 Alto rendimiento: RocksDB utiliza un motor de base de datos de estructura de registro para obtener mejor rendimiento, y este motor se escribe en C++escrito. Key y value son flujos de bytes de cualquier tamaño.

2 Optimizado para almacenamiento rápido: RocksDB está optimizado para dispositivos de almacenamiento rápidos y de baja latencia (como flash o discos duros de alta velocidad), y aprovechará al máximo las altas tasas de lectura y escritura de flash y RAM.

3 Ajustabilidad : RocksDB es adecuado para varios tipos de carga de trabajo diferentes. Desde motores de almacenamiento de datos como MyRocks, hasta cachés de datos de aplicación, e incluso algunas tareas integradas, RocksDB puede manejar estos diferentes requisitos de carga de datos.

4 Operaciones básicas y avanzadas de bases de datos RocksDB proporciona algunas operaciones básicas, como abrir y cerrar bases de datos. También proporciona soporte de lectura y escritura para operaciones avanzadas como combinación y compresión de filtros.

;;8203;;8203;;8203;;8203;;8203;;8203;Instalación y uso de RockDB

La instalación de rocksDB tiene varias formas. Debido a que la versión binaria de la plataforma correspondiente no se proporciona oficialmente, es necesario compilarla y usarla por sí mismo.

La instalación de rocksDB es sencilla, pero requiere cambiar la perspectiva sobre rocksDB. No es una base de datos de nivel alto, sino una base de datos integrada de clave-almacenamiento de valores. Esto significa que puede agregar la dependencia de rocksDB a su proyecto Maven y probarlo en el entorno de desarrollo. Si no entiende esto, podría caer en uno de los dos métodos de instalación no recomendados a continuación.

Método uno Vaya al sitio web oficial de rocksDB y descubra que debe escribir un C++ programa (no recomendado)

#include <assert>
#include "rocksdb/db.h"
rocksdb::DB* db;
rocksdb::Options options;
options.create_if_missing = true;
rocksdb::Status status =
 rocksdb::DB::Open(options, "/tmp/testdb", &db);
assert(status.ok());

Crear una base de datos????? ¿Cómo es diferente de la que usé mysql o mongo, ¿por qué no hay un script como start.sh o start.bat?. ¿Tengo que escribirlo? Después de escribirlo y compilarlo, descubrí que no sabía cómo asociarlo con la biblioteca rocksDB, ¿qué hago, yo C++Se olvidaron todo.

Método dos Usar pyrocksDB (no recomendado)

http://pyrocksdb.readthedocs.io/en/latest/installation.html

La documentación de instalación detallada se puede encontrar en la documentación de instalación oficial de pyrocksDB.

Las dos formas anteriores son adecuadas para los que están familiarizados con C++ Para desarrolladores de Python es bastante amigable, pero no tanto para desarrolladores de Java.

A continuación, se introduce el tercer método.

Método tres: usar Maven (recomendado)

Crear un proyecto Maven nuevo, modificar pom.xml y agregar dependencias

<dependency>
 <groupId>org.rocksdb</groupId>
 <artifactId>rocksdbjni</artifactId>
 <version>5.8.6</version>
</dependency>

Puede elegir la versión que le guste.

Luego, configure el nivel de lenguaje de Maven más alto, aquí he configurado globalmente como1.8

<profiles>
 <profile>
 <id>jdk18</id>
 <activation>
  <activeByDefault>true</activeByDefault>
  <jdk>1.8</jdk>
 </activation>
 <properties>
  <maven.compiler.source>1.8</maven.compiler.source>
  <maven.compiler.target>1.8</maven.compiler.target>
  <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
 </properties>
 </profile>
</profiles>

Hasta aquí, el entorno está configurado, ¿no ha vuelto al mundo familiar de Java?

Luego, copie una clase del paquete de código fuente, modifique la configuración de ejecución en el IDE, agregue una ruta de almacenamiento de base de datos durante la ejecución del programa, y puede ejecutar la prueba. Daré este clase al final del artículo.

El console de ejecución generará registros, y también aparecerán nuevos archivos en el archivo.

Próximamente se actualizarán más información sobre la API de desarrollo de rockDB, así como su aplicación en producción, esperamos que todos lo sigan.

// Derechos de autor (c) 2011-presente, Facebook, Inc. Todos los derechos reservados.
// Este código fuente está licenciado bajo ambas licencias GPLv2 (found in the)
// COPYING file in the root directory) and Apache 2.0 License
// (found in the LICENSE.Apache file in the root directory).
import org.rocksdb.*;
import org.rocksdb.util.SizeUnit;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
public class RocksDBSample {
 static {
 RocksDB.loadLibrary();
 }
 public static void main(final String[] args) {
 if (args.length < 1) {
 System.out.println("usage: RocksDBSample db_path");
 System.exit(-1);
 }
 final String db_path = args[0];
 final String db_path_not_found = db_path + "_not_found";
 System.out.println("RocksDBSample");
 try (final Options options = new Options();
  final Filter bloomFilter = new BloomFilter(10);
  final ReadOptions readOptions = new ReadOptions()
  .setFillCache(false);
  final Statistics stats = new Statistics();
  final RateLimiter rateLimiter = new RateLimiter(10000000,10000, 10)) {
 try (final RocksDB db = RocksDB.open(options, db_path_not_found)) {
 assert (false);
 } catch (final RocksDBException e) {
 System.out.format("Caught the expected exception"} -- %s\n", e);
 }
 try {
 options.setCreateIfMissing(true)
  .setStatistics(stats)
  .setWriteBufferSize(8 * SizeUnit.KB)
  .setMaxWriteBufferNumber(3)
  .setMaxBackgroundCompactions(10)
  .setCompressionType(CompressionType.SNAPPY_COMPRESSION)
  .setCompactionStyle(CompactionStyle.UNIVERSAL);
 } catch (final IllegalArgumentException e) {
 assert (false);
 }
 assert (options.createIfMissing() == true);
 assert (options.writeBufferSize() == 8 * SizeUnit.KB);
 assert (options.maxWriteBufferNumber() == 3);
 assert (options.maxBackgroundCompactions() == 10);
 assert (options.compressionType() == CompressionType.SNAPPY_COMPRESSION);
 assert (options.compactionStyle() == CompactionStyle.UNIVERSAL);
 assert (options.memTableFactoryName().equals("SkipListFactory"));
 options.setMemTableConfig(
  new HashSkipListMemTableConfig()
  .setHeight(4)
  .setBranchingFactor(4)
  .setBucketCount(2000000));
 assert (options.memTableFactoryName().equals("HashSkipListRepFactory"));
 options.setMemTableConfig(
  new HashLinkedListMemTableConfig()
  .setBucketCount(100000));
 assert (options.memTableFactoryName().equals("HashLinkedListRepFactory"));
 options.setMemTableConfig(
  new VectorMemTableConfig().setReservedSize(10000));
 assert (options.memTableFactoryName().equals("VectorRepFactory"));
 options.setMemTableConfig(new SkipListMemTableConfig());
 assert (options.memTableFactoryName().equals("SkipListFactory"));
 options.setTableFormatConfig(new PlainTableConfig());
 // Plano-La tabla requiere la lectura mmap
 options.setAllowMmapReads(true);
 assert (options.tableFactoryName().equals("PlainTable"));
 options.setRateLimiter(rateLimiter);
 final BlockBasedTableConfig table_options = new BlockBasedTableConfig();
 table_options.setBlockCacheSize(64 * SizeUnit.KB)
  .setFilter(bloomFilter)
  .setCacheNumShardBits(6)
  .setBlockSizeDeviation(5)
  .setBlockRestartInterval(10)
  .setCacheIndexAndFilterBlocks(true)
  .setHashIndexAllowCollision(false)
  .setBlockCacheCompressedSize(64 * SizeUnit.KB)
  .setBlockCacheCompressedNumShardBits(10);
 assert (table_options.blockCacheSize() === 64 * SizeUnit.KB);
 assert (table_options.cacheNumShardBits() === 6);
 assert (table_options.blockSizeDeviation() === 5);
 assert (table_options.blockRestartInterval() == 10);
 assert (table_options.cacheIndexAndFilterBlocks() == true);
 assert (table_options.hashIndexAllowCollision() == false);
 assert (table_options.blockCacheCompressedSize() == 64 * SizeUnit.KB);
 assert (table_options.blockCacheCompressedNumShardBits() == 10);
 options.setTableFormatConfig(table_options);
 assert (options.tableFactoryName().equals("BlockBasedTable"));
 try (final RocksDB db = RocksDB.open(options, db_path)) {
 db.put("hello".getBytes(), "world".getBytes());
 final byte[] value = db.get("hello".getBytes());
 assert ("world".equals(new String(value)));
 final String str = db.getProperty("rocksdb.stats");
 assert (str != null && !str.equals(""));
 } catch (final RocksDBException e) {
 System.out.format("[ERROR] capturada la excepción inesperada", -- %s\n", e);
 assert (false);
 }
 try (final RocksDB db = RocksDB.open(options, db_path)) {
 db.put("hello".getBytes(), "world".getBytes());
 byte[] value = db.get("hello".getBytes());
 System.out.format("Obtener('hello') = %s\n",
  new String(value));
 for (int i = 1; i <= 9; ++i) {
  for (int j = 1; j <= 9; ++j) {
  db.put(String.format("%dx%d", i, j).getBytes(),
  String.format("%d", i * j).getBytes());
  }
 }
 for (int i = 1; i <= 9; ++i) {
  for (int j = 1; j <= 9; ++j) {
  System.out.format("%s ", new String(db.get(
  String.format("%dx%d", i, j).getBytes())));
  }
  System.out.println("");
 }
 // escribir prueba por lotes
 try (final WriteOptions writeOpt = new WriteOptions()) {
  for (int i = 10; i <= 19; ++i) {
  try (final WriteBatch batch = new WriteBatch()) {
  for (int j = 10; j <= 19; ++j) {
  batch.put(String.format("%dx%d", i, j).getBytes(),
   String.format("%d", i * j).getBytes());
  }
  db.write(writeOpt, batch);
  }
  }
 }
 for (int i = 10; i <= 19; ++i) {
  for (int j = 10; j <= 19; ++j) {
  assert (new String(
  db.get(String.format("%dx%d", i, j).getBytes())).equals(
  String.format("%d", i * j)));
  System.out.format("%s ", new String(db.get(
  String.format("%dx%d", i, j).getBytes())));
  }
  System.out.println("");
 }
 value = db.get("1x1".getBytes());
 assert (value != null);
 value = db.get("world".getBytes());
 assert (value == null);
 value = db.get(readOptions, "world".getBytes());
 assert (value == null);
 final byte[] testKey = "asdf".getBytes();
 final byte[] testValue =
  "asdfghjkl;'?><MNBVCXZQWERTYUIOP{+_)()*&^%$#@".getBytes();
 db.put(testKey, testValue);
 byte[] testResult = db.get(testKey);
 assert (testResult != null);
 assert (Arrays.equals(testValue, testResult));
 assert (new String(testValue).equals(new String(testResult)));
 testResult = db.get(readOptions, testKey);
 assert (testResult != null);
 assert (Arrays.equals(testValue, testResult));
 assert (new String(testValue).equals(new String(testResult)));
 final byte[] insufficientArray = new byte[10];
 final byte[] enoughArray = new byte[50];
 int len;
 len = db.get(testKey, insufficientArray);
 assert (len > insufficientArray.length);
 len = db.get("asdfjkl;".getBytes(), enoughArray);
 assert (len == RocksDB.NOT_FOUND);
 len = db.get(testKey, enoughArray);
 assert (len == testValue.length);
 len = db.get(readOptions, testKey, insufficientArray);
 assert (len > insufficientArray.length);
 len = db.get(readOptions, "asdfjkl;".getBytes(), enoughArray);
 assert (len == RocksDB.NOT_FOUND);
 len = db.get(readOptions, testKey, enoughArray);
 assert (len == testValue.length);
 db.remove(testKey);
 len = db.get(testKey, enoughArray);
 assert (len == RocksDB.NOT_FOUND);
 // repeat the test with WriteOptions
 try (final WriteOptions writeOpts = new WriteOptions()) {
  writeOpts.setSync(true);
  writeOpts.setDisableWAL(true);
  db.put(writeOpts, testKey, testValue);
  len = db.get(testKey, enoughArray);
  assert (len == testValue.length);
  assert (new String(testValue).equals(
  new String(enoughArray, 0, len)));
 }
 try {
  for (final TickerType statsType : TickerType.values()) {
  if (statsType != TickerType.TICKER_ENUM_MAX) {
  stats.getTickerCount(statsType);
  }
  }
  System.out.println("getTickerCount() passed.");
 } catch (final Exception e) {
  System.out.println("Failed in call to getTickerCount()");
  assert (false); //Should never reach here.
 }
 try {
  for (final HistogramType histogramType : HistogramType.values()) {
  if (histogramType != HistogramType.HISTOGRAM_ENUM_MAX) {
  HistogramData data = stats.getHistogramData(histogramType);
  }
  }
  System.out.println("getHistogramData() passed.");
 } catch (final Exception e) {
  System.out.println("Failed in call to getHistogramData()");
  assert (false); //Should never reach here.
 }
 try (final RocksIterator iterator = db.newIterator()) {
  boolean seekToFirstPassed = false;
  for (iterator.seekToFirst(); iterator.isValid(); iterator.next()) {
  iterator.status();
  assert (iterator.key() != null);
  assert (iterator.value() != null);
  seekToFirstPassed = true;
  }
  if (seekToFirstPassed) {
  System.out.println("iterator seekToFirst tests passed.");
  }
  boolean seekToLastPassed = false;
  for (iterator.seekToLast(); iterator.isValid(); iterator.prev()) {
  iterator.status();
  assert (iterator.key() != null);
  assert (iterator.value() != null);
  seekToLastPassed = true;
  }
  if (seekToLastPassed) {
  System.out.println("iterator seekToLastPassed tests passed.");
  }
  iterator.seekToFirst();
  iterator.seek(iterator.key());
  assert (iterator.key() != null);
  assert (iterator.value() != null);
  System.out.println("iterator seek test passed.");
 }
 System.out.println("iterator tests passed.");
 final List<byte[]> keys = new ArrayList<>();
 try (final RocksIterator iterator = db.newIterator()) {
  for (iterator.seekToLast(); iterator.isValid(); iterator.prev()) {
  keys.add(iterator.key());
  }
 }
 Map<byte[], byte[]> values = db.multiGet(keys);
 assert (values.size() == keys.size());
 for (final byte[] value1 : values.values()) {
  assert (value1 != null);
 }
 values = db.multiGet(new ReadOptions(), keys);
 assert (values.size() == keys.size());
 for (final byte[] value1 : values.values()) {
  assert (value1 != null);
 }
 } catch (final RocksDBException e) {
 System.err.println(e);
 }
 }
 }
}

Esto es todo lo que les he presentado sobre la instalación y aplicación de RocksDB en Java. Si tienen alguna duda después de aprender, pueden discutirla en el área de comentarios a continuación. Gracias por su apoyo a la tutorial de grito.

Te gustará