3

この質問は特にCouchbaseに関するものですが、memcachedAPIを使用するすべてのものに当てはまると思います。

たとえば、クライアント/サーバーチャットアプリケーションを作成していて、サーバー上で、各ユーザーのチャットセッション情報をデータバケットに保存しているとします。チャットセッションが終了したら、データバケットからセッションオブジェクトを削除しますが、同時に、レポートと分析の目的で永続的なNoSQLデータストアに永続化する必要もあります。また、セッションがタイムアウトしたときなど、キャッシュの削除時にセッションオブジェクトを永続化する必要があります。

これを効率的に実行し、メモリ内キャッシュシステムの可能な限り最高のパフォーマンスを維持できるようにする、ある種の「ベストプラクティス」(または私が欠落しているCouchbaseの機能)はありますか?

4

2 に答える 2

2

Couchbase Server 2.0を使用すると、2つのバケット(または、物理リソースを分離する場合は2つの別個のクラスター)をセットアップできます。セッションクラスターでは、おそらく次のように、JSONドキュメント(キーと値のペアの値)を保存します。

{ 
  "sessionId" : "some-guid",
  "users" : [ "user1", "user2" ],
  "chatData" : [ "message1", "message2"],
  "isActive" : true,
  "timestamp" : [2012, 8, 6, 11, 57, 00]
}

次に、セッションデータベースにMap / Reduceビューを記述して、期限切れのすべてのアイテムのリストを表示できます(以下の例では、メタ引数を使用して、DP4ではなくCouchbaseServer2.0の最近のビルドが必要です。

function(doc, meta) {
  if (doc.sessionId && ! doc.isActive) {
    emit(meta.id, null);
  }
}

次に、任意のCouchbaseクライアントライブラリを使用して、ビューをクエリし、アイテムを取得して分析クラスター(またはバケット)に移動するタスクを実行できます。したがって、C#ではこれは次のようになります。

var view = sessionClient.GetView("sessions", "all_inactive");
foreach(var item in view) 
{
   var doc = sessionClient.Get(item.ItemId);
   analyticsClient.Store(StoreMode.Add, item.ItemId, doc);
   sessionClient.Remove(item.ItemId);
}

代わりに、明示的なタイムスタンプまたは有効期限を使用したい場合は、タイムスタンプに基づいてビューにインデックスを付けることができます。

function(doc) {
   if (doc.sessionId && ! doc.isActive) {
      emit(timestamp, null);
   }
}

次に、タスクは、x日以内にタッチされていないすべてのドキュメントを返すためのスタートキーを含めることにより、ビューをクエリできます。

var view = sessionClient.GetView("sessions", "all_inactive").StartKey(new int[] { DateTime.Now.Year, DateTime.Now.Months, DateTime.Now.Days-1);

foreach(var item in view)
{
   var doc = sessionClient.Get(item.ItemId);
   analyticsClient.Store(StoreMode.Add, item.ItemId, doc);
   sessionClient.Remove(item.ItemId);
}

Couchbase Server 2.0の詳細については、 http://www.couchbase.com/couchbase-server/nextを確認してください。このアプローチについて説明が必要な場合は、このスレッドでお知らせください。

-ジョン

于 2012-08-06T16:17:18.037 に答える
1

CouchDBストレージは(最終的には)永続的であり、組み込みの有効期限メカニズムがないため、保存するものはすべて、削除するまで保存されたままになります。保存されたデータのタイムアウトを設定できるMemcachedとは異なります。したがって、セッションをCouchDBに保存している場合は、有効期限が切れたときに自分で削除する必要があります。これは自動化されたメカニズムではないためですが、自分で行うことで、必要な場所にデータを保存しない理由はありません。同時。

BTHセッションストレージにSQLよりも永続的なNoSQLを使用する利点はありません(その逆も同様です)。両方のパフォーマンスはIOバウンドになります。メモリのみのキーストアまたはハイブリッドソリューションは、まったく別の話です。

問題については、アプリのセッションの有効期限/セッションを閉じるメカニズムでデータを移動するか、セッションストレージで期限切れのセッションを定期的にチェックしてデータを移動するcronジョブを実行します。

于 2012-07-30T20:07:59.117 に答える