Hatena::¥Ö¥í¥°(Diary)

CLOVER

2018-01-13

RocksDB JNI ¤ ÇÍ· ¤ Ö

ºÇ¶áÍ· ¤ ó ¤ ÀJava ¥ é ¥ ¤ ¥ Ö ¥ é ¥ ê ¤ ¬RocksDB ¤ ÎJNI ¥ Ð ¥ ¤ ¥ ó ¥ Ç ¥ £ ¥ ó ¥ ° ¤ ò »È ¤ à ¤ Æ ¤ ¤ ¤ ë ¤ Î ¤ ò ¸« ¤ Æ¡ ¢ ¤ ± ¤ à ¤ ³ ¤ ¦ ´ Êñ ¤ ËƳÆþ ¤ Ç ¤ ¤ ë ¤ Ρ © ¤ È ¤ ¤ ¤ ¦ ´ ¶ ¤ ¸ ¤ ò´üÂÔ ¤ · ¤ Æ
»î ¤ · ¤ Æ ¤ ß ¤ ë ¤ ³ ¤ È ¤ Ë ¤ · ¤ Þ ¤ · ¤ ¿¡£

RocksDB ¤ È ¤ Ï¡ ©

¤ der l ¤ â ¤ der l ¤ â¡ ¢ RocksDB ¤ Ë ¤ Ä ¤ ¤ ¤ Æ¡£

RocksDB | A persistent key-value store | RocksDB

Facebook¡ ¢ Google ¤ ÎLevelDB ¤ òºÎÍÑ ¤ · ¤ und ¥ ¡¼ ¥ Ð ¥ ê ¥ 塼·¿ ¥ ¹ ¥ È ¥ ¢ ¡ÖRocksDB¡×¸ø ³ «¡£ ¥ Þ ¥ ë ¥ Á ¥ ³ ¥ ¢ ¤ È ¹ â® ¥ ¹ ¥ È ¥ 졼 ¥ ¸ ¤ ˺ÇŬ²½? Publickey

Facebook¡ ¢ Key-Value ¥ ¹ ¥ È ¥ ¢ ¡ÖRocksDB¡× ¤ ò ¥ ª¡¼ ¥ × ¥ ó ¥ ½¡¼ ¥ ¹ ²½¡§C ++ ¥ é ¥ ¤ ¥ Ö ¥ é ¥ ê ¤ È ¤ · ¤ Æ ¹ ½ÃÛ - ¡÷IT

no title

Google ¤ ÎLevelDB ¤ ò »È ¤ ¤ ¡ ¢ CPU ¥ ³ ¥ ¢ ¿¿ô» ý ¤ Ä ¥ µ¡¼ ¥ С¼ ¤ Ç ¤ Î ¥ ¹ ¥ ±¡¼ ¥ é ¥ Ó ¥ ê ¥ Æ ¥ n ¢ ¹ â® ¤ Ê ¥ ¹ ¥ È ¥ 졼 ¥ ¸ ¤ θúΨŪ ¤ ÊÍøÍÑ¡ ¢ IO ¥ Ð ¥ ¦ ¥ ó ¥ É¡ ¢ ¥ ¤ ¥ ó ¥ á ¥ â ¥ ê ¤ Ê ¤ É ¤ Î ¥  ¥ ¯ ¥ í¡¼ ¥ É ¤ ò
¥ µ ¥ Ý¡¼ ¥ È ¤ · ¤ ¿Key Value Store ¤ À ¤ der l ¤ ¦ ¤ Ç ¤ ¹ ¡£

¤ der l ¤ ¦ ¡ ¢ Key Value Store¡£

¤ Ê ¤ Î ¤ Ç¡ ¢ ¥ ª ¥ Ú ¥ 졼 ¥ · ¥ ç ¥ óŪ ¤ Ë ¤ ÏKey¡õValue ¤ Ê ¤ â ¤ Î ¤ ¬ÌÜÎ © ¤ Á ¤ Þ ¤ ¹ ¡£

Getting started | RocksDB

¥ É ¥ ¥ å ¥ á ¥ ó ¥ È ¤ Ï¡ ¢ GitHub ¤ ÎWiki ¤ ò ¸«¤ ë ¤ Î ¤ ¬ÎÉ ¤ µ ¤ der l ¤ ¦ ¤ Ç ¤ ¹ ¡£
Home? facebook/rocksdb Wiki? GitHub

´ ðËÜŪ ¤ ÊÁàºî ¤ Ï ¤ ³ ¤ Á ¤ é¡£

Basic Operations? facebook/rocksdb Wiki? GitHub

RocksDB JNI

RocksDB¼ «ÂÎ ¤ ÏC ++ ¤ ǽñ ¤« ¤ ì ¤ Æ ¤ ¤ ¤ ë ¤ Î ¤ Ç ¤ ¹ ¤ ¬¡ ¢ ¤ ³ ¤ ì ¤ ÎJava¸þþ ¤ ± ¤ ÎAPI¡ÊJNI »ÈÍÑ¡Ë ¤ ¬Äó¶¡ ¤ µ ¤ ì ¤ Æ ¤ ¤ ¤ Þ ¤ ¹ ¡£

https://github.com/facebook/rocksdb/tree/v5.9.2/java

RocksJava Basics? facebook/rocksdb Wiki? GitHub

¤ ¢ ¤ Þ ¤ ê¾ÜºÙ ¤ Ê ¥ µ ¥ ó ¥ × ¥ ë ¤ Ê ¤ É ¤ Ï ¤ Ê ¤ ¤ ¤ è ¤ ¦ ¤ Ç ¤ ¹ ¤ ¬¡ ¢ Ê · ° ϵ ¤ ¤ ò ¸«¤ Ä ¤ Ľñ ¤ ¤ ¤ Æ ¤ ¤ ¤ à ¤ Æ ¤ ß ¤ Þ ¤ ¹ ¡£

»È ¤ à ¤ Æ ¤ ß ¤ ë

Maven°ÍÂ ¸´Ø · ¸ ¡£

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

¤ ¢ ¤ È¡ ¢ ¥ Æ ¥ ¹ ¥ È ¥ é ¥ ¤ ¥ Ö ¥ é ¥ ê ¤ âÍÑ°Õ¡£

        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter-api</artifactId>
            <version>5.0.2</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.assertj</groupId>
            <artifactId>assertj-core</artifactId>
            <version>3.9.0</version>
        </dependency>

¥ Æ ¥ ¹ ¥ È ¥ ³¡¼ ¥ É ¤ ο÷·Á ¤ Ï ¤ ³ ¤ Á ¤ é¡£
src/test/java/org/littlewings/rocksdbjni/RocksDBJniTest/RocksDBJniTest.java

package org.littlewings.rocksdbjni.RocksDBJniTest;

import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import org.junit.jupiter.api.Test;
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 static org.assertj.core.api.Assertions.assertThat;

public class RocksDBJniTest {
    // ¤³¤³¤Ë¡¢¥Æ¥¹¥È¤ò½ñ¤¯¡ª
}

½é ¤ á ¤ Æ ¤ ÎRocksDB

Wiki ¤ ò ¸«¤ Ä ¤ Ä¡ ¢ ½ñ ¤ ¤ ¤ Æ ¤ ß ¤ und ¤ Î ¤ zu ¤ ³ ¤ Á ¤ é¡£

    @Test
    public void gettingStarted() {
        // RocksDB.loadLibrary();

        try (Options options = new Options().setCreateIfMissing(true);
             RocksDB rocks = RocksDB.open(options, "sample-db")) {
            // put
            rocks.put("key".getBytes(StandardCharsets.UTF_8), "value".getBytes(StandardCharsets.UTF_8));

            // get
            assertThat(rocks.get("key".getBytes(StandardCharsets.UTF_8))).isEqualTo("value".getBytes(StandardCharsets.UTF_8));
            assertThat(rocks.get("missing".getBytes(StandardCharsets.UTF_8))).isNull();

            // get¡ÊÇÛÎó¼õ¤±¼è¤ê¡Ë
            byte[] valueBytes = new byte[5];
            assertThat(rocks.get("key".getBytes(StandardCharsets.UTF_8), valueBytes))
                    .isEqualTo(5);
            assertThat(valueBytes).isEqualTo("value".getBytes(StandardCharsets.UTF_8));

            // exist
            StringBuilder builder = new StringBuilder();
            assertThat(rocks.keyMayExist("key".getBytes(StandardCharsets.UTF_8), builder)).isTrue();
            assertThat(builder.toString()).isEqualTo("value");

            builder = new StringBuilder();
            assertThat(rocks.keyMayExist("missing".getBytes(StandardCharsets.UTF_8), builder)).isFalse();
            assertThat(builder.toString()).isEmpty();

            // delete
            rocks.delete("key".getBytes(StandardCharsets.UTF_8));
            assertThat(rocks.get("key".getBytes(StandardCharsets.UTF_8))).isNull();
        } catch (RocksDBException e) {
            throw new RuntimeException(e);
        }
    }

RocksDB#loadLibrary ¤ Ï ¥ Í ¥ ¤ ¥ Æ ¥ £ ¥ Ö ¥ é ¥ ¤ ¥ Ö ¥ é ¥ ê ¤ Î ¥ í¡¼ ¥ É ¤ Î ¤ und ¤ á ¤ Î ¤ â ¤ Î ¤ Ç ¤ ¹ ¤ ¬¡ ¢ ¤ ³ ¤ ε½Ò¼ «ÂÎ ¤ ÏRocksDB ¤ Îstatic ¥ ¤ ¥ Ë ¥ · ¥ ã ¥ é ¥ ¤ ¥ ¶¡¼ ¤ Ë ¤ â¼ÂÁõ ¤ µ ¤ ì ¤ Æ ¤ ¤ ¤ Þ ¤ ¹ ¤ ·¡ ¢
¤ der l ¤ ξ ¤ Î³Æ¼ï ¥ ¯ ¥ é ¥ ¹ ÍøÍÑ »þ ¤ Ë ¤ â¸Æ ¤ ӽР¤ µ ¤ ì ¤ Æ ¤ ¤ ¤ und ¤ ê ¤ · ¤ Þ ¤ ¹ ¡£

RocksDB.loadLibrary();

https://github.com/facebook/rocksdb/blob/v5.9.2/java/src/main/java/org/rocksdb/RocksDB.java#L34-L36
https://github.com/facebook/rocksdb/blob/v5.9.2/java/src/main/java/org/rocksdb/Options.java#L24-L26

¤ Ê ¤ Î ¤ Ç¡ ¢ ÌÀ¼¨Åª ¤ Ê¸Æ ¤ ӽР¤ · ¤ ÏÉÔÍס © ¥ é ¥ ¤ ¥ Ö ¥ é ¥ ê ¥ í¡¼ ¥ ÉÀè ¤ Î ¥ Ñ ¥ ¹ ¤ ò ¥ Ç ¥ Õ ¥ © ¥ ë ¥ È°Ê ³° ¤ Î ¤ â ¤ Î ¤ Ë ¤ ¹ ¤ ë¾ì ¹ ç ¤ Ï¡ ¢ ¥ Ñ ¥ ¹ ¤ ò »ØÄê²Äǽ ¤ Ê ¥ ª¡¼ ¥ С¼ ¥ í¡¼ ¥ É ¤ µ ¤ ì ¤ und ¥ С¼ ¥ ¸ ¥ ç ¥ ó ¤ ò
»ÈÍÑ ¤ ¹ ¤ ë ¤ È ¤ è ¤ ¤ ¤ Ç ¤ ¹ ¡£

¤ Ê ¤ ª¡ ¢ ¤ ³ ¤ ÎRockdsDB ¤ ÎJAR ¤ Ë´Þ ¤ Þ ¤ ì ¤ Æ ¤ ¤ ¤ ë ¥ Í ¥ ¤ ¥ Æ ¥ £ ¥ Ö ¥ é ¥ ¤ ¥ Ö ¥ é ¥ ê ¤ Ï¡ ¢ ¤ ³ ¤ Á ¤ é ¤ Ë ¤ Ê ¤ ê ¤ Þ ¤ ¹ ¡£

$ jar -tvf ~/.m2/repository/org/rocksdb/rocksdbjni/5.9.2/rocksdbjni-5.9.2.jar  | grep -E 'dll|so'
8304735 Tue Dec 19 10:26:10 JST 2017 librocksdbjni-linux32.so
8162410 Tue Dec 19 10:14:02 JST 2017 librocksdbjni-linux64.so
9137088 Wed Jan 03 11:58:08 JST 2018 librocksdbjni-linux-ppc64le.so
6688256 Wed Jan 03 19:46:16 JST 2018 librocksdbjni-win64.dll

RocksDB ¥ ¤ ¥ ó ¥ ¹ ¥ und ¥ ó ¥ ¹ ¤ μèÆÀ ¤ Ï¡ ¢ Option ¤ òºîÀ®¸å ¤ ËRocksDB#open ¤ Ç ¹ Ô ¤ ¤ ¤ Þ ¤ ¹ ¡£

        try (Options options = new Options().setCreateIfMissing(true);
             RocksDB rocks = RocksDB.open(options, "sample-db")) {

RocksDB#open ¤ ËÅÏ ¤ ¹ ¥ Ñ ¥ ¹ ¤ Ï¡ ¢ RocksDB ¤ Î ¥ Õ ¥ ¡ ¥ ¤ ¥ ë ¤ òÇÛÃÖ ¤ ¹ ¤ ë ¤ und ¤ á ¤ Î ¥ Ç ¥ £ ¥ ì ¥ ¯ ¥ È ¥ ê ¤ Ç ¤ ¹ ¡£

º£²ó ¤ Î »ØÄê ¤ À ¤ È¡ ¢ ¥« ¥ ì ¥ ó ¥ È ¥ Ç ¥ £ ¥ ì ¥ ¯ ¥ È ¥ ê ¤ Ë ¤ ³ ¤ ¦ ¤ ¤ ¤ ¦ ¤ Î ¤ zu ¤ Ç ¤ ¤ ¢ ¤ zu ¤ ê ¤ Þ ¤ ¹ ¡£

$ find sample-db -type f
sample-db/LOG
sample-db/MANIFEST-000001
sample-db/CURRENT
sample-db/OPTIONS-000005
sample-db/LOCK
sample-db/000003.log
sample-db/IDENTITY

Wiki ¤ Ë ¤ ÏOptions#setCreateIfMissing ¤ Î »ØÄê ¤ Ͻñ ¤ ¤ ¤ Æ ¤ ¢ ¤ ê ¤ Þ ¤ ¹ ¤ ¬¡ ¢ Options» ØÄê ¤ Ê ¤ · ¤ ÎRocksDB#open ¤ ò¸Æ ¤ ӽР¤ ¹ ¤ È¡ ¢ °ÅÌÛŪ ¤ Ë »ØÄê ¤ · ¤ Æ ¤ ¯ ¤ ì ¤ Æ ¤ ¤ ¤ und ¤ ê ¤ · ¤ Þ ¤ ¹ ¡£
https://github.com/facebook/rocksdb/blob/v5.9.2/java/src/main/java/org/rocksdb/RocksDB.java#L155-L161

Áàºî ¤ Ï¡ ¢ ¥ ¡¼ ¤ âÃÍ ¤ âbyteÇÛÎó ¤ Ç ¹ Ô ¤ ¤ ¤ Þ ¤ ¹ ¡£

            // put
            rocks.put("key".getBytes(StandardCharsets.UTF_8), "value".getBytes(StandardCharsets.UTF_8));

            // get
            assertThat(rocks.get("key".getBytes(StandardCharsets.UTF_8))).isEqualTo("value".getBytes(StandardCharsets.UTF_8));
            assertThat(rocks.get("missing".getBytes(StandardCharsets.UTF_8))).isNull();

get »þ ¤ Ë¡ ¢ byteÇÛÎó ¤ òÅÏ ¤ · ¤ Æ ¤ der l ¤ ÎÃæ¿È ¤ òµÍ ¤ á ¤ Æ ¤ â ¤ é ¤ ¦ ¤ È ¤ ¤ ¤ ¦ ¤ ä ¤ êÊý ¤ â ¤ Ç ¤ ¤ Þ ¤ ¹ ¡£

            // get¡ÊÇÛÎó¼õ¤±¼è¤ê¡Ë
            byte[] valueBytes = new byte[5];
            assertThat(rocks.get("key".getBytes(StandardCharsets.UTF_8), valueBytes))
                    .isEqualTo(5);
            assertThat(valueBytes).isEqualTo("value".getBytes(StandardCharsets.UTF_8));

¥ ¡¼ ¤ θºß³Îǧ¡Ä ¤ Î³ä ¤ Ë¡ ¢ ÃÍ ¤ âƱ »þ ¤ Ë¼è ¤ ì ¤ und ¤ ê ¤ · ¤ Þ ¤ ¹ ¡£ ¤ · ¤« ¤ âStringBuilder ¤ Ç¡£

            // exist
            StringBuilder builder = new StringBuilder();
            assertThat(rocks.keyMayExist("key".getBytes(StandardCharsets.UTF_8), builder)).isTrue();
            assertThat(builder.toString()).isEqualTo("value");

            builder = new StringBuilder();
            assertThat(rocks.keyMayExist("missing".getBytes(StandardCharsets.UTF_8), builder)).isFalse();
            assertThat(builder.toString()).isEmpty();

delete¡£

            // delete
            rocks.delete("key".getBytes(StandardCharsets.UTF_8));
            assertThat(rocks.get("key".getBytes(StandardCharsets.UTF_8))).isNull();

¤ der l ¤ · ¤ Æ¡ ¢ ºÇ¸å ¤ Ëclose ¤ · ¤ Þ ¤ ¹ ¡£º£²ó ¤ Ï¡ ¢ try-with-resourcesʸ ¤ Ç ¥ ¯ ¥ í¡¼ ¥ º ¤ · ¤ Æ ¤ ¤ ¤ Þ ¤ ¹ ¡£
Memory Management

Wiki ¤ Ë ¤ âµºÜ ¤ zu ¤ ¢ ¤ ê ¤ Þ ¤ ¹ ¤ ¬¡ ¢ AbstractNativeReference¡ÊRocksDB ¤ Ê ¤ É ¤ Î¿Æ ¥ ¯ ¥ é ¥ ¹ ¡Ë#finalize ¤ Ç ¤ âclose ¤ ò¸Æ ¤ ӽР¤ ¹ ¤ è ¤ ¦ ¤ ˼ÂÁõ ¤ µ ¤ ì ¤ Æ ¤ Ï ¤ ¤ ¤ Þ ¤ ¹ ¤ ¬¡ ¢
¤ der l ¤ ì ¤ ËÍê ¤ ë ¤ Ù ¤ ¤ Ç ¤ Ê ¤ ¤ »Ý ¤ â ¹ ç ¤ ï ¤» ¤ ƽñ ¤ ¤ ¤ Æ ¤ ¢ ¤ ê ¤ Þ ¤ ¹ ¡£

¼ÂºÝ¡ ¢ deprecate ¤ ß ¤ und ¤ ¤ ¤ Ç ¤ ¹ ¤ ·¡ ¢ ¤ der l ¤ â ¤ der l ¤ â ¤ Á ¤ ã ¤ ó ¤ Èclose ¤ ¹ ¤ Ù ¤ ¤ Ç ¤ ¹ ¤ è ¤ Í¡£
https://github.com/facebook/rocksdb/blob/v5.9.2/java/src/main/java/org/rocksdb/AbstractNativeReference.java#L67-L75

¤ der l ¤ ξ¡ ¢ merge¡ ¢ multiGet¡ ¢ deleteRange¡ ¢ iterator¡ ¢ snapshot ¤ Ê ¤ É ¤ Ê ¤ É ¤ ¢ ¤ ë ¤ è ¤ ¦ ¤ Ç ¤ ¹ ¤ ¬¡ ¢ º£²ó ¤ Ï ¥ Ñ ¥ ¹ ¡Ä¡£

Column Family

Wiki ¤ JavaÎ API ¤ ÎÉôʬ ¤ Ë ¤ Á ¤ ç ¤ à ¤ È ¤ À ¤ ±ºÜ ¤ à ¤ Æ ¤ ¤ ¤ ¿³ä ¤ Ë ¤ Ï¡ ¢ ¥ µ ¥ ó ¥ × ¥ ë ¤ âÆà ¤ Ë ¤ Ê ¤ «¤ à ¤ und ¤ Î ¤ Ç ¥ Á ¥ ã ¥ ì ¥ ó ¥ ¸ ¤ È ¤ ¤ ¤ ¦ °ÕÌ£ ¤ ÇColumn Family ¤ ⿨ ¤ à ¤ Æ ¤ ß ¤ ë ¤ ³ ¤ È ¤ Ë ¤ · ¤ Þ ¤ · ¤ ¿¡£
RocksJava Basics? facebook/rocksdb Wiki? GitHub

Column Family ¤ ò »È ¤ ¦ ¤ È¡ ¢ Îà» ÷ ¤ Î ¥ ¡¼¡ ¢ ÃÍ ¤ ò ¥ ° ¥ 롼 ¥ ײ½ ¤ · ¤ Æ´ÉÍý ¤ ¹ ¤ ë ¤ ³ ¤ È ¤ zu ¤ Ç ¤ ¤ Þ ¤ ¹ ¡£

Column Families? facebook/rocksdb Wiki? GitHub

Column Family ¤ ò »ØÄê ¤» ¤ º ¤ Ë ¥ ¢ ¥ ¯ ¥ »¥ ¹ ¤ · ¤ ¿¾ì ¹ ç ¤ Ï¡ ¢ ¡Ö ¥ Ç ¥ Õ ¥ © ¥ ë ¥ È ¤ Ρ×Column Family ¤ È ¤ · ¤ Æ °· ¤ ï ¤ ì ¤ Æ ¤ ¤ ¤ ë ¤ è ¤ ¦ ¤ Ç ¤ ¹ ¡£

¤ Ç ¤ Ï¡ ¢ Java ¥ ³¡¼ ¥ É ¤ ǽñ ¤ ¤ ¤ Æ ¤ ß ¤ Þ ¤ · ¤ ç ¤ ¦ ¡£

    @Test
    public void withColumnFamily() {
        try (ColumnFamilyOptions columnFamilyOptions = new ColumnFamilyOptions().optimizeUniversalStyleCompaction()) {
            List<ColumnFamilyDescriptor> columnFamilyDescriptors = Arrays.asList(
                    new ColumnFamilyDescriptor(RocksDB.DEFAULT_COLUMN_FAMILY, columnFamilyOptions),
                    new ColumnFamilyDescriptor("column-family1".getBytes(), columnFamilyOptions),
                    new ColumnFamilyDescriptor("column-family2".getBytes(), columnFamilyOptions)
            );

            List<ColumnFamilyHandle> columnFamilyHandles = new ArrayList<>();

            try (DBOptions options = new DBOptions().setCreateIfMissing(true).setCreateMissingColumnFamilies(true);
                 RocksDB rocks = RocksDB.open(options, "column-family-db", columnFamilyDescriptors, columnFamilyHandles)) {
                // column handle
                ColumnFamilyHandle defaultColumnFamilyHandle = columnFamilyHandles.get(0);
                ColumnFamilyHandle columnFamily1Handle = columnFamilyHandles.get(1);
                ColumnFamilyHandle columnFamily2Handle = columnFamilyHandles.get(2);

                // put
                rocks.put(defaultColumnFamilyHandle,
                        "key".getBytes(StandardCharsets.UTF_8), "value-default".getBytes(StandardCharsets.UTF_8));
                rocks.put(columnFamily1Handle,
                        "key".getBytes(StandardCharsets.UTF_8), "value-column-family1".getBytes(StandardCharsets.UTF_8));
                rocks.put(columnFamily2Handle,
                        "key".getBytes(StandardCharsets.UTF_8), "value-column-family2".getBytes(StandardCharsets.UTF_8));

                // get
                assertThat(rocks.get(defaultColumnFamilyHandle, "key".getBytes(StandardCharsets.UTF_8))).isEqualTo("value-default".getBytes(StandardCharsets.UTF_8));
                assertThat(rocks.get(columnFamily1Handle, "key".getBytes(StandardCharsets.UTF_8))).isEqualTo("value-column-family1".getBytes(StandardCharsets.UTF_8));
                assertThat(rocks.get(columnFamily2Handle, "key".getBytes(StandardCharsets.UTF_8))).isEqualTo("value-column-family2".getBytes(StandardCharsets.UTF_8));

                // delete
                rocks.delete(defaultColumnFamilyHandle, "key".getBytes(StandardCharsets.UTF_8));
                assertThat(rocks.get(defaultColumnFamilyHandle, "key".getBytes(StandardCharsets.UTF_8)))
                        .isNull();
                assertThat(rocks.get(columnFamily1Handle, "key".getBytes(StandardCharsets.UTF_8)))
                        .isEqualTo("value-column-family1".getBytes(StandardCharsets.UTF_8));
                assertThat(rocks.get(columnFamily2Handle, "key".getBytes(StandardCharsets.UTF_8)))
                        .isEqualTo("value-column-family2".getBytes(StandardCharsets.UTF_8));

                // default column family
                rocks.put(defaultColumnFamilyHandle,
                        "key1".getBytes(StandardCharsets.UTF_8), "value1".getBytes(StandardCharsets.UTF_8));
                assertThat(rocks.get("key1".getBytes(StandardCharsets.UTF_8))).isEqualTo("value1".getBytes(StandardCharsets.UTF_8));

                rocks.put("key2".getBytes(StandardCharsets.UTF_8), "value2".getBytes(StandardCharsets.UTF_8));
                assertThat(rocks.get(defaultColumnFamilyHandle, "key2".getBytes(StandardCharsets.UTF_8))).isEqualTo("value2".getBytes(StandardCharsets.UTF_8));
                assertThat(rocks.get("key2".getBytes(StandardCharsets.UTF_8))).isEqualTo("value2".getBytes(StandardCharsets.UTF_8));
            } catch (RocksDBException e) {
                throw new RuntimeException(e);
            }
        }
    }

Column Family ¤ ò »ÈÍÑ ¤ ¹ ¤ ë¾ì ¹ ç ¤ Ï¡ ¢ ¤ Þ ¤ ºColumn Family ¤ ÎÄêµÁ ¤ ò ¹ Ô ¤ ¦ ¤ È ¤ ³ ¤ í ¤« ¤ é »Ï ¤ á ¤ Þ ¤ ¹ ¡£

        try (ColumnFamilyOptions columnFamilyOptions = new ColumnFamilyOptions().optimizeUniversalStyleCompaction()) {
            List<ColumnFamilyDescriptor> columnFamilyDescriptors = Arrays.asList(
                    new ColumnFamilyDescriptor(RocksDB.DEFAULT_COLUMN_FAMILY, columnFamilyOptions),
                    new ColumnFamilyDescriptor("column-family1".getBytes(), columnFamilyOptions),
                    new ColumnFamilyDescriptor("column-family2".getBytes(), columnFamilyOptions)
            );

º£²ó ¤ Ï3 ¥ «¥ é ¥ à ¤ òÍÑ°Õ¡£ ¤ ³ ¤ ³ ¤ Ç ¤ â¡ ¢ Column Family̾ ¤ λ ØÄê ¤ ÏbyteÇÛÎó ¤ È ¤ Ê ¤ ê ¤ Þ ¤ ¹ ¡£

RocksDB#DEFAULT_COLUMN_FAMILY ¤ È ¤ ¤ ¤ ¦ ¤ Î ¤ Ï¡ ¢ ¡Ödefault¡× ¤ È ¤ ¤ ¤ ¦ ̾Á° ¤ ÎColumn Family ¤ Ç ¤ ¹ ¡£
https://github.com/facebook/rocksdb/blob/v5.9.2/java/src/main/java/org/rocksdb/RocksDB.java#L22

¶õ ¤ ÎList ¤ òÍÑ°Õ ¤ · ¤ Æ ¤ ¤ ¤ Þ ¤ ¹ ¤ ¬¡ ¢ ¤ ³ ¤ ì ¤ ÏRocksDB#open »þ ¤ ËÃæ¿È ¤ òµÍ ¤ á ¤ Æ ¤ â ¤ é ¤ ¦ ¤ ³ ¤ È ¤ Ë ¤ Ê ¤ ê ¤ Þ ¤ ¹ ¡£

            List<ColumnFamilyHandle> columnFamilyHandles = new ArrayList<>();

Column Family ¤ ò »ÈÍÑ ¤ ¹ ¤ ë¾ì ¹ ç¡ ¢ RocksDB#open» þ ¤ Ë ¤ ÏDBOptions ¤ òÅÏ ¤ ¹ ɬÍ× ¤ zu ¤ ¢ ¤ ê ¤ Þ ¤ ¹ ¡£ ¤ ³ ¤ Î »þ ¤ Ë¡ ¢ Column Family ¤ ÎÄêµÁ¡ÊDescriptor¡Ë ¤ ÈÀè ¤ Û ¤ ɺîÀ® ¤ · ¤ und
¶õ ¤ ÎList ¤ òÅÏ ¤ · ¤ Æ ¤ ª ¤ ¤ Þ ¤ ¹ ¡£

            try (DBOptions options = new DBOptions().setCreateIfMissing(true).setCreateMissingColumnFamilies(true);
                 RocksDB rocks = RocksDB.open(options, "column-family-db", columnFamilyDescriptors, columnFamilyHandles)) {

¤ ¹ ¤ ë ¤ È¡ ¢ RocksDB ¤ Î ¥ ¤ ¥ ó ¥ ¹ ¥ und ¥ ó ¥ ¹ ¤ ¬¼èÆÀ ¤ Ç ¤ ¤ ë ¤ È ¤ È ¤ â ¤ Ë¡ ¢ ¶õ ¤ ÎList ¤ ËColumn Family ¤ ÎHandle ¤ ¬µÍ ¤ á ¤ é ¤ ì ¤ Æ ¤ ¤ ¤ Þ ¤ ¹ ¡£

                // column handle
                ColumnFamilyHandle defaultColumnFamilyHandle = columnFamilyHandles.get(0);
                ColumnFamilyHandle columnFamily1Handle = columnFamilyHandles.get(1);
                ColumnFamilyHandle columnFamily2Handle = columnFamilyHandles.get(2);

Handle ¤ È ¤ ¤ ¤ ¦ ÊÑ¿ô̾ ¤ ÇRocksDBÃæ ¤ Î ¥ ½¡¼ ¥ ¹ ¥ ³¡¼ ¥ ÉÃæ ¤ â½Ð ¤ Æ ¤ ¯ ¤ ë ¤ Î ¤ Ç ¤ ¹ ¤ ¬¡ ¢ ¤ Ê ¤ ó ¤ «C·Ï ¤ à ¤ Ý ¤ ¤ ¤ Ç ¤ ¹ ¤ Í¡£

°Ê ¹ ß ¤ Ï¡ ¢ ¤ ³ ¤ ÎHandle ¤ ò »È ¤ à ¤ ÆÁàºî ¤ ò ¹ Ô ¤ ¤ ¤ Þ ¤ ¹ ¡£

put¡ ¢ get »þ ¤ Ë¡ ¢ ¤ ³ ¤ ÎHandle ¤ òÂè1°ú¿ô ¤ Ë» ØÄê ¤ · ¤ Æ ¥ ¢ ¥ ¯ ¥ »¥ ¹ ¤ ò ¹ Ô ¤ ¤ ¤ Þ ¤ ¹ ¡£

                // put
                rocks.put(defaultColumnFamilyHandle,
                        "key".getBytes(StandardCharsets.UTF_8), "value-default".getBytes(StandardCharsets.UTF_8));
                rocks.put(columnFamily1Handle,
                        "key".getBytes(StandardCharsets.UTF_8), "value-column-family1".getBytes(StandardCharsets.UTF_8));
                rocks.put(columnFamily2Handle,
                        "key".getBytes(StandardCharsets.UTF_8), "value-column-family2".getBytes(StandardCharsets.UTF_8));

                // get
                assertThat(rocks.get(defaultColumnFamilyHandle, "key".getBytes(StandardCharsets.UTF_8))).isEqualTo("value-default".getBytes(StandardCharsets.UTF_8));
                assertThat(rocks.get(columnFamily1Handle, "key".getBytes(StandardCharsets.UTF_8))).isEqualTo("value-column-family1".getBytes(StandardCharsets.UTF_8));
                assertThat(rocks.get(columnFamily2Handle, "key".getBytes(StandardCharsets.UTF_8))).isEqualTo("value-column-family2".getBytes(StandardCharsets.UTF_8));

Column Family ¤ ò »ØÄê ¤ ¹ ¤ ë¾ì ¹ ç ¤ Ï¡ ¢ Ʊ ¤ ¸ ¥ ¡¼ ¤ Ç ¤ ¢ ¤ à ¤ Æ ¤ âColumn Familyñ°Ì ¤ Ç´ÉÍý ¤ µ ¤ ì ¤ ë ¤ ³ ¤ È ¤ Ë ¤ Ê ¤ ë ¤ und ¤ á¡ ¢ ÊÌ¡ ¹ ¤ Ë °· ¤ ï ¤ ì ¤ ë ¤ ³ ¤ È ¤ Ë ¤ Ê ¤ ê ¤ Þ ¤ ¹ ¡£

¤ Ê ¤ Î ¤ Ç¡ ¢ ¤ ¢ ¤ ëColumn Family ¤ Ëɳ ¤ Å ¤ ¯ÃÍ ¤ òºï½ü ¤ · ¤ Æ ¤ â¡ ¢ ¾ ¤ ÎColumn Family ¤ ÏÆà ¤ ËÊÑ ¤ ï ¤ ê ¤ Þ ¤ »¤ ó¡£

                // delete
                rocks.delete(defaultColumnFamilyHandle, "key".getBytes(StandardCharsets.UTF_8));
                assertThat(rocks.get(defaultColumnFamilyHandle, "key".getBytes(StandardCharsets.UTF_8)))
                        .isNull();
                assertThat(rocks.get(columnFamily1Handle, "key".getBytes(StandardCharsets.UTF_8)))
                        .isEqualTo("value-column-family1".getBytes(StandardCharsets.UTF_8));
                assertThat(rocks.get(columnFamily2Handle, "key".getBytes(StandardCharsets.UTF_8)))
                        .isEqualTo("value-column-family2".getBytes(StandardCharsets.UTF_8));

¤ Þ ¤ ¿¡ ¢ Column Family ¤ ò »ØÄê ¤» ¤ º ¤ Ëñ½ã ¤ Ëput¡ ¢ get ¤ Ê ¤ É ¤ ò ¹ Ô ¤ à ¤ ¿¾ì ¹ ç ¤ Ï¡ ¢ ¡Ödefault¡× ¤ ÎColumn Family ¤ ò »ÈÍÑ ¤ · ¤ Æ ¤ ¤ ¤ ë ¤ È ¸« ¤ Ê ¤ µ ¤ ì ¤ Þ ¤ ¹ ¡£

                // default column family
                rocks.put(defaultColumnFamilyHandle,
                        "key1".getBytes(StandardCharsets.UTF_8), "value1".getBytes(StandardCharsets.UTF_8));
                assertThat(rocks.get("key1".getBytes(StandardCharsets.UTF_8))).isEqualTo("value1".getBytes(StandardCharsets.UTF_8));

                rocks.put("key2".getBytes(StandardCharsets.UTF_8), "value2".getBytes(StandardCharsets.UTF_8));
                assertThat(rocks.get(defaultColumnFamilyHandle, "key2".getBytes(StandardCharsets.UTF_8))).isEqualTo("value2".getBytes(StandardCharsets.UTF_8));
                assertThat(rocks.get("key2".getBytes(StandardCharsets.UTF_8))).isEqualTo("value2".getBytes(StandardCharsets.UTF_8));

¤ Ê ¤ ó ¤ È ¤ Ê ¤ ist ¢ Ê · ° ϵ ¤ ¤ Ï ¤ ï ¤ "¤ ê ¤ Þ ¤ · ¤ und ¤ Í¡£ jung

¤ Þ ¤ È ¤ á

RocksDB ¤ ÎJNI ¥ Ð ¥ ¤ ¥ Ç ¥ £ ¥ ó ¥ ° ¤ ò »î ¤ · ¤ Æ ¤ ß ¤ Þ ¤ · ¤ ¿¡£

RocksDB¼ «ÂΡ ¢ ½é ¤ á ¤ Æ» È ¤ à ¤ und ¤ Î ¤ Ç ¤ ¹ ¤ ¬¡ ¢ ¤ ± ¤ à ¤ ³ ¤ ¦ ´ Êñ ¤ Ë »È ¤ ¨ ¤ ÆÎÉ ¤« ¤ à ¤ und ¤ Ç ¤ ¹ ¤ Í¡£ ¥ Ç¡¼ ¥ und ¥ Ù¡¼ ¥ ¹ ¤ È ¤ Þ ¤ Ç ¤ Ï ¤ ¤ ¤ «¤ Ê ¤ ¯ ¤ Æ ¤ â¡ ¢ ±Ê ³ ² der l ¤ · ¤ und ¤ ¤ ¡õKey Value StoreŪ ¤ Ê ¤ â ¤ Î ¤ Ç
¥ ¢ ¥ ¯ ¥ »¥ ¹ ¤ Ç ¤ ¤ ì ¤ Ð ¤ è ¤ ¤ ¤ ¯ ¤ é ¤ ¤ ¤ Î ¤ â ¤ Î ¤ Ë ¤ Ä ¤ ¤ ¤ Æ ¤ Ï¡ ¢» È ¤ à ¤ Æ ¤ ß ¤ Æ ¤ â ¤ ¤ ¤ ¤ ¤ «¤ Ê ¤ È» × ¤ ¤ ¤ Þ ¤ ¹ ¡£

¥ ¹ ¥ Ñ ¥ àÂкö ¤ Î ¤ und ¤ á ¤ Î ¥ À ¥ ß¡¼ ¤ Ç ¤ ¹ ¡£ ¤ â ¤ · ¸ «¤ ¨ ¤ Æ ¤ ⲿ ¤ âÆþÎÏ ¤ · ¤ Ê ¤ ¤ ¤ Ç ¤ ¯ ¤ À ¤ µ ¤ ¤
¥²¥¹¥È


²èÁüÇ § ¾ Ú

¥ È ¥ é ¥ Ã ¥ ¯ ¥ Ð ¥ Ã ¥ ¯ - http://d.hatena.ne.jp/Kazuhira/20180113/1515859146