Caching memcache中ID列表的查询值

Caching memcache中ID列表的查询值,caching,memcached,Caching,Memcached,我正在浏览memcache文档,我确实看到了get方法,该方法可用于获取给定键的值 有没有一种方法可以在到memcache server的一次往返中获取给定密钥集的值?回答您的问题:有。不是像Redis那样直接支持,而是支持。 您可能想知道的协议级支持是安静模式,您可以参考。我引述如下: 客户端应该将multi-get(对于减少网络往返仍然很重要!)实现为n个流水线请求,第一个n-1是getq/getkq,最后一个是常规的get/getk 根据SpyMemcached,您可以使用getBulk。

我正在浏览memcache文档,我确实看到了
get
方法,该方法可用于获取给定键的值


有没有一种方法可以在到memcache server的一次往返中获取给定密钥集的值?

回答您的问题:有。不是像Redis那样直接支持,而是支持。
您可能想知道的协议级支持是
安静模式
,您可以参考。我引述如下:

客户端应该将multi-get(对于减少网络往返仍然很重要!)实现为n个流水线请求,第一个n-1是getq/getkq,最后一个是常规的get/getk

根据
SpyMemcached
,您可以使用
getBulk
getBulk
的实现是fire n
getq
操作,然后是一个
noop
操作。以下是代码片段:

// 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);
//设置初始头文件
ByteBuffer bb=ByteBuffer.allocate(大小);
对于(Map.Entry me:bkeys.entrySet()){
最终字节[]keyBytes=me.getValue();
最后一个字符串key=keys.get(me.getKey());
//自定义标题
bb.put(需要魔法);
bb.put(CMD_GETQ);
bb.putShort((short)keyBytes.length);
bb.put((字节)0);//extralen
bb.put((字节)0);//数据类型
bb.putShort(vbmap.get(key.shortValue());//vbucket
bb.putInt(keyBytes.length);
bb.putInt(me.getKey());
bb.putLong(0);//cas
//实际密钥
bb.put(keyBytes);
}
//添加noop
bb.put(需要魔法);
put((字节)noopperationimpl.CMD);
bb.putShort((short)0);
bb.put((字节)0);//外透镜
bb.put((字节)0);//数据类型
bb.putShort((short)0);//含蓄的
bb.putInt(0);
bb.putInt(terminalOpaque);
bb.putLong(0);//中科院
bb.flip();
塞布弗(bb);

threadpool
无关,假设我们在一个网络包中发送n个memcached包的数据,并在一个响应中获取所有数据。我跳过处理多节点的过程,因为您可能不在乎。

wow。。几天前,我已经完成了《如何运行memcache指南》。所以,你能不能更详细地解释一下,因为你的答案太神秘了,我无法理解。。。。从你的引述来看,这是否意味着memcache的用户应该通过使用threadpool发送多个get请求来实现multiget?@user2410148更新了答案,希望我能让自己更清楚一点。