0

私は現在、キー/値ストアで一括操作を必要とするアプリケーションを作成しています。現時点では、membase を使用しています。

spymemcached は一括取得を許可しますが、一括 CAS または一括追加は許可しません。実装されれば広く使われると思われる機能。

この時点で、一連の一括操作のコードは大まかに次のようになります。

「クライアント」は単一の MemcachedClient です。

ArrayList<Future<Boolean>> futures = new ArrayList<Future<Boolean>>();
ArrayList<String> bulkGet = new ArrayList<String>();
for(int i=0; i<50; i++){
    String key = "Key_" + x + "_" + i;
    Future<Boolean> fut = client.add(key, 0, "Value_" + x + "_" + i);
    futures.add(fut);
    bulkGet.add(key);
}

int count = 0;
for(Future<Boolean> fut : futures){
    if(fut.get()==true){
        count++;
    }
}
System.out.println("Added " + count + " records.");

Map<String,Object> bulkGot = client.getBulk(bulkGet);
System.out.println("Retrieved " + bulkGot.size() + " records");

Future.get() のブロッキング呼び出しは非常に効率が悪いようですが、もっと良い方法はありますか? 私の実際のシナリオでは、先物が戻ってきたらすぐに処理できるようにしたいと考えています (送信された順序である場合とそうでない場合があります)。

また、以下の運用は可能ですか(または実施予定ですか)?

-既存の値を追加または返す

-値が既知の値と等しい場合は削除

-値が既知の値と等しい場合に設定します

ありがとう、マーカス

4

1 に答える 1

0

ここでは、できるだけ多くのことに対処しようとします。

Spymemcached は一括取得を許可しますが、一括 CAS または一括追加は許可しません。実装されれば広く使われると思われる機能。

私はここに完全に同意しますが、おそらく、bulkAdd、bulkCas などの関数を MemcachedClient に追加することはしないでしょう。現在、Spymemcached はデフォルトで get および set 操作を可能な限り一括セットまたは一括取得として送信することで最適化します。これをすべての memcached 操作に拡張する計画がありますが、まだ実行されていません。ただし、それは舞台裏で行われ、おそらく spymemcached ユーザーが直接利用することはできません。

Future.get() のブロッキング呼び出しは非常に非効率的ですか?

はい、これについては以下で説明しますが、これが一括操作の場合、コードはまだ少しの間ブロックされることに注意してください。個々の追加操作では、コードは最初の操作に対してのみブロックする可能性があります。これは、その後、他のすべての操作が既に終了しているため、最初の呼び出しの後の Future.get() への呼び出しがすぐに返されるためです。

それで、より良い方法はありますか?

MemcachedClient クラスを拡張し、既存の関数の 1 つをコピーして、独自のコードをコールバック関数に追加できます。

また、以下の運用は可能ですか(または実施予定ですか)?

Spymemcached は、memcached が提供するすべての機能を実装しています。あなたが言及した操作は、Spymemcached の機能を使用して既にビルドできます。

-既存の値を追加または返す

keyA を追加します。失敗した場合は、keyA を取得します。

-値が既知の値と等しい場合は削除

キーAを取得します。keyA が既知の値と等しい場合、keyA を削除します

- 値が既知の値と等しい場合に設定

キーAを取得します。keyA が既知の値と等しい場合は、keyB を設定します。

memcached に新しいオプションを追加したい場合は、memcached.org にリクエストを投稿してください。正直に言うと、memcached 関係者は API をできるだけ小さくしたいので、API が追加される可能性は低いと思います。

于 2011-08-18T00:16:48.770 に答える