2

ヒントが必要です: 100 個の文字列を保持できる tcp データベース サーバーを作成しています (データを保持するために文字列のベクトルを使用しました)。これまでに私が達成した基本的な機能は次のとおりです。

クライアントは送信します: PUT "index" "value" - 文字列は vector[index] に入れられます。
クライアントの送信: GET "index" - vector[index] がクライアントに送信されます

私は自分の仕事をboost::asio async echo server example http://www.boost.org/doc/libs/1_39_0/doc/html/boost_asio/example/echo/async_tcp_echo_server.cppに基づいています

現在、サーバーの機能を次のように拡張したいと考えています。

まだ解決されていません 1. 開始時にベクターの開始コンテンツをファイルからロードし、終了時に保存できるようにします。

解決済み2. データベース要素にタイマーを設定します。ベクター [インデックス] の文字列の有効期間は 30 秒にする必要があります。入力から 30 秒以内に新しいデータがベクター [インデックス] に到着しない場合は、コンテンツを消去する必要があります。

残っている唯一の問題は、終了/開始時にベクター データを保存/ロードすることです。ベクトルには 100 個の文字列しか含まれていないため、fstream を使用して単純に読み取り/書き込みを行うことができましたが、保存のトリガーに問題があります。

私の非同期サーバーのメイン関数には次のものが含まれています: io_service.run(); サーバーの実行中にキーを押してアクションをトリガーするにはどうすればよいですか? 私の最初の推測は、 http: //www.boost.org/doc/libs/1_51_0/doc/html/boost_asio/example/chat/posix_chat_client.cpp の例のように、ユーザー入力からの async_read です。他のアイデアはありますか?

4

2 に答える 2

1

タイムスタンプを値とともに保存してタイマーを実装し、検索時にエントリの有効期限が切れているかどうかを確認します。エントリがまだ有効かどうかを誰も尋ねなかった場合、タイマーで CPU をウェイクアップする必要はありません。

また、ネットワーク コードとデータベース実装の間に適切な抽象化がある限り、データベースを最適なものに適合させることができます。エントリの最大数があり、それらがすべてメモリに収まる場合はvector、絶対に問題なく、SQLite はおそらくやり過ぎです。

于 2012-10-23T16:54:06.850 に答える
0

RedisまたはMemcachedを使用するのは、有効な時間が既にあるためです。両方とも C++ ドライバーを持っています。

于 2012-10-23T13:57:23.130 に答える