2016-08-17 5 views
1

私はmemcacheのドキュメントを調べていましたが、私はgetメソッドを参照して、指定されたキーの値を取得することができます。memcacheからのIdのリストのクエリ値

Memcacheサーバーへの1回のラウンドトリップで特定のキーセットの値をフェッチする方法はありますか?

答えて

2

質問にお答えします:はい、あります。 Redisのように直接サポートするのではなく、はい。
知りたいプロトコルレベルのサポートはquiet modeであり、hereを参照できます。そして、私は以下のように引用:

クライアントは、(ネットワークの往復を減らすために、まだ重要!)マルチ取得実装する必要があり、nは要求パイプラインとして、最初のn-1はgetq/getkqされ、最後には、get/getk定期的なもの。

SpyMemcachedによれば、getBulkを使用できます。 getBulkの実装はfire n getqオペレーションであり、その後にはnoopオペレーションが1つ続きます。次のコードスニペットです:threadpoolを行うには

// set up the initial header stuff 
ByteBuffer bb = ByteBuffer.allocate(size); 
for (Map.Entry<Integer, byte[]> me : bkeys.entrySet()) { 
    final byte[] keyBytes = me.getValue(); 
    final String key = keys.get(me.getKey()); 

    // Custom header 
    bb.put(REQ_MAGIC); 
    bb.put(CMD_GETQ); 
    bb.putShort((short) keyBytes.length); 
    bb.put((byte) 0); // extralen 
    bb.put((byte) 0); // data type 
    bb.putShort(vbmap.get(key).shortValue()); // vbucket 
    bb.putInt(keyBytes.length); 
    bb.putInt(me.getKey()); 
    bb.putLong(0); // cas 
    // the actual key 
    bb.put(keyBytes); 
} 
// Add the noop 
bb.put(REQ_MAGIC); 
bb.put((byte) NoopOperationImpl.CMD); 
bb.putShort((short) 0); 
bb.put((byte) 0); // extralen 
bb.put((byte) 0); // data type 
bb.putShort((short) 0); // reserved 
bb.putInt(0); 
bb.putInt(terminalOpaque); 
bb.putLong(0); // cas 

bb.flip(); 
setBuffer(bb); 

何も、我々は一つのネットワークパッケージと1つの応答に入るすべてのデータでは、n個のmemcachedのパッケージのデータを送信する、としましょう。気にしないかもしれないので、私はマルチノードを扱うプロセスをスキップします。

+0

wow ..私は数日前に 'memcacheガイドを実行する方法 'を完了しました。あなたの答えがあまりにもわかりにくいので、バイトで詳しく説明してください。....あなたからは、memcacheのユーザーはスレッドプールを使用して複数のリクエストを送信してマルチジェットを実装する必要がありますか? – Bhuvan

+0

@ user2410148は、私が自分自身を少しはっきりさせた答えと希望を更新しました。 –

関連する問題