最新のC ++へのキー/バリューストア開発の移植
Cassandraに似たデータベースサーバーを開発しています。 開発はCで始まりましたが、クラスがなければ非常に複雑になりました。 現在、私はすべてをC ++ 11に移植しましたが、まだ「モダンな」C ++を学習しており、多くのことについて疑問があります。 データベースはキー/値のペアで動作します。すべてのペアにはさらに多くの情報があります。いつが作成され、いつ期限切れになるか(期限切れでない場合は0)。各ペアは不変です。 キーはC文字列、値はvoid *ですが、少なくとも今のところ、値をC文字列として操作しています。 抽象IListクラスがあります。3つのクラスから継承 VectorList -C動的配列-std :: vectorに似ていますが、 realloc LinkList -チェックとパフォーマンス比較のために作成 SkipList -最終的に使用されるクラス。 将来はRed Black木も作ろうと思います。 それぞれIListに、キーでソートされた、0個以上のペアへのポインターが含まれています。 IList長くなりすぎた場合は、特殊ファイルとしてディスクに保存できます。この特殊ファイルは一種ですread only list。 キーを検索する必要がある場合は、 最初にメモリ内IListが検索されます(SkipList、SkipListまたはLinkList)。 次に、日付でソートされたファイルに検索が送信されます (最新のファイルが最初、最も古いファイル-最後)。 これらのファイルはすべてメモリにmmapされます。 何も見つからない場合、キーは見つかりません。 私はIList物事の実装に疑いはありません。 現在私を困惑させているのは以下の通りです: ペアは異なるサイズであり、それらはによって割り当てられnew()、それらをstd::shared_ptr指し示しています。 class Pair{ public: // several methods... private: struct Blob; std::shared_ptr<const Blob> _blob; }; struct Pair::Blob{ uint64_t …