LoginSignup
0
0

More than 3 years have passed since last update.

RocksDBのColumn Familiesについてのメモ

Posted at

RocksDBのColumn Familiesとは

同じデータベース内でキーが同じでも、Column Familiesが異なると、登録・参照・削除できるようになります。
公式のドキュメントには「データベースを論理的にパーティション分割する方法を提供します」とのことでした。
名前空間と同じような概念と思って良いと思います。
以下が特徴です(公式をGoogle翻訳ですので、正しくは公式ドキュメントを参照してください)。

  • 異なるColumn Familiesへのアトミックな操作が可能
    Write({cf1, key1, value1}, {cf2, key2, value2}) がアトミックに行えるということです。cf1とcf2がColumn Familiesの指定です。

  • データベース内のColumn Familiesに渡った一貫的なビュー
    よくわかりません

  • 異なるColumn Familiesを個別に構成する機能
    よくわかりません

  • 新しいColumn Familiesの追加、ドロップができます。どちらの操作もかなり高速です
    記載のとおりです

公式ドキュメント
https://github.com/facebook/rocksdb/wiki/Column-Families

どんなときに使う?

正直わかりません。ただこんな機能があることを知っていると、いつか役立つかも。。。

使い方

public class SampleCulmunFamily {

    public void execute() throws Exception {

        // DBの作成
        try (final RocksDB db = RocksDB.open("sample")) {
            // column familyの作成(先にColumnFamilyDescriptorを複
            // columnfamilyを複数作成する場合は、ColumnFamilyDescriptorのListを作成して、db.openに渡せばOKです
            try (final ColumnFamilyHandle columnFamilyHandle = db.createColumnFamily(
                    new ColumnFamilyDescriptor("new_cf".getBytes(),
                            new ColumnFamilyOptions()))) {
            }
        }

        // DBと2つのCulmunFamilyの作成
        final List<ColumnFamilyDescriptor> columnFamilyDescriptors = new ArrayList<>();
        // CulmunFamilyを指定しない場合でも、defaultというCulmunFamilyが裏で作成されています。
        // したがって、今回は、defaultとnew_cfという2つのCulmunFamilyを作成するということになります
        columnFamilyDescriptors.add(new ColumnFamilyDescriptor(
                RocksDB.DEFAULT_COLUMN_FAMILY, new ColumnFamilyOptions()));
        columnFamilyDescriptors.add(new ColumnFamilyDescriptor(
                "new_cf".getBytes(), new ColumnFamilyOptions()));
        final List<ColumnFamilyHandle> columnFamilyHandles = new ArrayList<>();
        try (final DBOptions options = new DBOptions();
                final RocksDB db = RocksDB.open("sample",
                        columnFamilyDescriptors, columnFamilyHandles)) {

            // CulumnFamilyの識別子を取得
            ColumnFamilyHandle defaultColumnFamily = columnFamilyHandles.get(0);
            ColumnFamilyHandle newColumnFamily = columnFamilyHandles.get(1);

            try {
                // 同一キーで登録します。識別子を使用して、登録先を振り分けます。
                db.put(defaultColumnFamily, new WriteOptions(),
                        "key".getBytes(), "default_value".getBytes());
                db.put(newColumnFamily, new WriteOptions(),
                        "key".getBytes(), "new_cf_value".getBytes());

                // 参照
                System.out.println(new String(db.get(defaultColumnFamily, "key".getBytes())));
                System.out.println(new String(db.get(newColumnFamily, "key".getBytes())));

                // 削除
                db.delete(defaultColumnFamily, "key".getBytes());
                db.delete(newColumnFamily, "key".getBytes());

                // column familyの削除
                db.dropColumnFamily(newColumnFamily);
            } finally {
                for (final ColumnFamilyHandle handle : columnFamilyHandles) {
                    handle.close();
                }
            }
        }
    }
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0