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