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

تثبيت وتطبيق RocksDB في Java

rocksDB هوقابل للإدراجالمخزن المستدام للـ key-value

ما يلي هو شرح من موقع rocksDB باللغة الصينية 

https://rocksdb.org.cn/

يتميز بـ أربع خصائص

1 الأداء العالي: يستخدم RocksDB محرك قاعدة بيانات بنية السجلات لتحسين الأداء، ويتم كتابة هذا المحرك بلغة C++ لتحقيق أداء أفضل. يمكن أن تكون المفاتيح والمقادير كلاهما نطاقات بيانات من أي حجم

2 تحسين التخزين السريع: تم تحسين RocksDB لتعمل على أجهزة التخزين السريعة منخفضة التأخير (مثل التخزين السريع أو الأقراص الصلبة السريعة) بشكل خاص. سيستفيد RocksDB إلى أقصى حد من أداء القراءة والكتابة العالي للتخزين السريع وذاكرة الوصول العشوائي

3 التكيفية: يتكيف RocksDB مع أنواع مختلفة من الأحمال. من محركات التخزين مثل MyRocks، إلى حافظات البيانات التطبيقية، وحتى الأحمال المدمجة، يمكن أن يتعامل مع هذه الحاجات المختلفة من حيث الأحمال البيانية

4 المعاملات الأساسية والخاصة للقواعد البيانية RocksDB يقدم بعض المعاملات الأساسية مثل فتح وإغلاق قاعدة البيانات. كما يقدم دعمًا للقراءة والكتابة للمعاملات المتقدمة مثل التركيب والتضييق

تثبيت واستخدام RockDB

يوجد عدة طرق لتثبيت rocksDB. نظرًا لأنه لم يقدم الموقع الرسمي مكتبات ثنائية للمنصات المختلفة، فإنه يتطلب التجميع باستخدامك.

تثبيت rocksDB بسيط للغاية، ولكن يجب أن نغير نظرتنا إلى rocksDB. إنه ليس قاعدة بيانات ثقيلة، بل هو نظام التخزين المدمج للقيم المفتاحية. هذا يعني أنك يمكنك إضافة اعتماد rocksDB إلى مشروع Maven الخاص بك فقط، وأن تجرب ذلك في بيئة التطوير.

الطريقة الأولى: الذهاب إلى موقع rocksDB الرسمي لمعرفة أنه يجب عليك كتابة برنامج C++ (ليست مُنصحة)

#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());

كيف أقوم بإنشاء قاعدة بيانات؟ لماذا لا تشبه قاعدة بيانات MySQL أو MongoDB التي استخدمتها من قبل؟ لماذا لا يوجد سكربت مثل start.sh أو start.bat؟ هل علي أن أكتب؟ بعد كتابة الكود، وجدت أنني لا أعرف كيف أربط مكتبة rocksDB، ماذا أفعل؟ هل نسيت لغة C++؟

الطريقة الثانية: استخدام pyrocksDB (ليست مُنصحة)

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

للحصول على وثائق التثبيت التفصيلية، يرجى زيارة صفحة تثبيت pyrocksDB على الموقع الرسمي.

الطريقتان السابقتان تعتبران سهلتين للغاية للذين يعرفون C++ أو python، ولكن ليستا مفيدتين جدًا للذين يعملون ببرنامج Java.

الآن سنقوم بشرح الطريقة الثالثة.

الطريقة الثالثة: استخدام Maven (يُنصح بها)

إنشاء مشروع Maven جديد، تعديل إعدادات الاعتماد في pom.xml وأضف

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

يمكنك اختيار الإصدار الذي تفضلونه.

ثم قم بزيادة مستوى اللغة في Maven، لقد قمت بضبطه بشكل عام على 1.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>

إلى هنا، تم تثبيت البيئة، هل عدت إلى عالم جافا المألوف؟

ثم قم نسخ فئة واحدة من مجلد مكتبات المصدر، وعدل إعدادات التشغيل في بيئة التطوير، وأضف مسار تخزين قاعدة البيانات أثناء التشغيل، يمكنك تشغيل الاختبار. سأقدم لك هذا الفئة في نهاية المقال.

سيكون هناك خروج للجلسة على وحدة التحكم، كما سيظهر في الملف أيضًا ملفات جديدة.

سيتم تحديث المزيد من المعلومات حول API تطوير rockDB، وكذلك التطبيقات في الإنتاج، نرجو منكم متابعة.

// حقوق الطبع والنشر (c) 2011-الحالية، فيسبوك، وشركة. جميع الحقوق محفوظة.
// هذا الكود المصدر مسموح به تحت كل من GPLv2 (موجود في
// ملف COPYING في مجلد الجذر) والرخصة Apache 2.0
// (موجود في ملف LICENSE.Apache في مجلد الجذر).
استيراد org.rocksdb.*;
استيراد org.rocksdb.util.حجم.الوحدة;
استيراد جافا.استخدام.القوائم.الجديدة;
استيراد جافا.استخدام.النصوص;
استيراد جافا.استخدام.القوائم;
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);
 }
 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);
 استطاع (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());
 استطاع (options.memTableFactoryName().equals("SkipListFactory"));
 options.setTableFormatConfig(new PlainTableConfig());
 // يتطلب قراءة mmap جدول-النص-العادي
 options.setAllowMmapReads(true);
 استطاع (options.tableFactoryName().equals("PlainTable"));
 options.setRateLimiter(rateLimiter);
 final BlockBasedTableConfig table_options = new BlockBasedTableConfig();
 table_options.setBlockCacheSize(64 * وحدة_الحجم.KB)
  .setFilter(bloomFilter)
  .setCacheNumShardBits(6)
  .setBlockSizeDeviation(5)
  .setBlockRestartInterval(10)
  .setCacheIndexAndFilterBlocks(true)
  .setHashIndexAllowCollision(false)
  .setBlockCacheCompressedSize(64 * وحدة_الحجم.KB)
  .setBlockCacheCompressedNumShardBits(10);
 استطاع (table_options.blockCacheSize() == 64 * وحدة_الحجم.KB);
 استطاع (table_options.cacheNumShardBits() == 6);
 استطاع (table_options.blockSizeDeviation() == 5);
 استطاع (table_options.blockRestartInterval() == 10);
 استطاع (table_options.cacheIndexAndFilterBlocks() == صحيح);
 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] لقد تم اصطياد الاستثناء غير المتوقع -- %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("Get('hello') = %s\n",
  new String(value));
 لـ (int i = 1; i <= 9; ++i) {
  لـ (int j = 1; j <= 9; ++j) {
  db.put(String.format("%dx%d", i, j).getBytes(),
  String.format("%d", i * j).getBytes());
  {}
 {}
 لـ (int i = 1; i <= 9; ++i) {
  لـ (int j = 1; j <= 9; ++j) {
  System.out.format("%s ", new String(db.get(
  String.format("%dx%d", i, j).getBytes())));
  {}
  System.out.println("");
 {}
 // كتابة تجربة مجموعة البيانات
 حاول (final WriteOptions writeOpt = new WriteOptions()) {
  للفور循环 (int i = 10; i <= 19; ++i) {
  try (final WriteBatch batch = new WriteBatch()) {
  
  batch.put(String.format("%dx%d", i, j).getBytes(),
   String.format("%d", i * j).getBytes());
  {}
  db.write(writeOpt, batch);
  {}
  {}
 {}
 للفور循环 (int i = 10; i <= 19; ++i) {
  
  
  db.get(String.format("%dx%d", i, j).getBytes())).equals(
  
  System.out.format("%s ", new String(db.get(
  String.format("%dx%d", i, j).getBytes())));
  {}
  System.out.println("");
 {}
 value = db.get("1x1".getBytes());
 استطيع (value != null);
 value = db.get("world".getBytes());
 استطيع (value == null);
 value = db.get(readOptions, "world".getBytes());
 استطيع (value == null);
 final byte[] testKey = "asdf".getBytes();
 final byte[] testValue =
  "asdfghjkl;؟><MNBVCXZQWERTYUIOP{+_)(*&^%$#@".getBytes();
 db.put(testKey, testValue);
 byte[] testResult = db.get(testKey);
 استطيع (testResult != null);
 استطيع (مقارنة مصفوفات.equals(testValue, testResult));
 assert (new String(testValue).equals(new String(testResult)));
 testResult = db.get(readOptions, testKey);
 استطيع (testResult != null);
 استطيع (مقارنة مصفوفات.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);
 // تكرار الاختبار مع 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 {
  للبحث عن (final TickerType statsType : TickerType.values()) {
  إذا (statsType != TickerType.TICKER_ENUM_MAX) {
  stats.getTickerCount(statsType);
  {}
  {}
  System.out.println("getTickerCount() passed.");
 } ملاحظة (final Exception e) {
  System.out.println("Failed in call to getTickerCount()");
  استدلال (false); // Should never reach here.
 {}
 try {
  للأسفل final HistogramType histogramType : HistogramType.values()) {
  إذا (histogramType != HistogramType.HISTOGRAM_ENUM_MAX) {
  HistogramData data = stats.getHistogramData(histogramType);
  {}
  {}
  System.out.println("getHistogramData() passed.");
 } ملاحظة (final Exception e) {
  System.out.println("Failed in call to getHistogramData()");
  استدلال (false); // Should never reach here.
 {}
 try (final RocksIterator iterator = db.newIterator()) {
  boolean seekToFirstPassed = false;
  للأسفل iterator.seekToFirst(); iterator.isValid(); iterator.next()) {
  iterator.status();
  استدلال (iterator.key() != null);
  assert (iterator.value() != null);
  seekToFirstPassed = true;
  {}
  إذا (seekToFirstPassed) {
  System.out.println("iterator seekToFirst tests passed.");
  {}
  boolean seekToLastPassed = false;
  for (iterator.seekToLast(); iterator.isValid(); iterator.prev()) {
  iterator.status();
  استدلال (iterator.key() != null);
  assert (iterator.value() != null);
  seekToLastPassed = true;
  {}
  إذا (seekToLastPassed) {
  System.out.println("iterator seekToLastPassed tests passed.");
  {}
  iterator.seekToFirst();
  iterator.seek(iterator.key());
  استدلال (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);
 {}
 {}
 {}
{}

وهذا هو كل محتوى التثبيت والتطبيق لـ RocksDB في لغة جافا الذي قدمناه لكم اليوم، إذا كان لديكم أي أسئلة بعد الدراسة، يمكنكم مناقشتها في منطقة التعليقات أدناه، شكراً لدعم تعليمات النطق.

سيحبك هذا