Java+Membase+SpymeCached批量操作

Java+Membase+SpymeCached批量操作,java,cas,bulk,membase,spymemcached,Java,Cas,Bulk,Membase,Spymemcached,我目前正在编写一个需要对键/值存储进行批量操作的应用程序,目前我正在使用membase SpymeMached允许批量获取,但不允许批量CAS或添加;我认为如果实现这些功能,它们将被广泛使用 此时,我的一组批量操作代码大致如下所示 客户端是单个MemcachedClient ArrayList<Future<Boolean>> futures = new ArrayList<Future<Boolean>>(); ArrayList<Stri

我目前正在编写一个需要对键/值存储进行批量操作的应用程序,目前我正在使用membase

SpymeMached允许批量获取,但不允许批量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上的阻塞调用似乎效率很低,有更好的方法吗?在我的实际场景中,我希望能够在期货返回时尽快处理期货,这可能与期货发送的顺序有关,也可能与否

此外,是否可能或计划实施以下操作

-添加或返回现有值

-如果值等于已知值,则删除

-如果值等于已知值,则设置

谢谢,
马库斯

我将在这里尽可能多地阐述一些事情

SpymeMached允许批量获取,但不允许批量CAS或添加;我认为如果实现这些功能,它们将被广泛使用

我完全同意,但我们可能不会加入bulkAdd,bulkCas。。。将函数添加到MemcachedClient。当前,默认情况下,通过尽可能将get和set操作作为大容量集或大容量get发送来优化它们。有计划将此扩展到所有memcached操作,但尚未完成。当它是,虽然它将发生在幕后,可能不会直接提供给SpymeMached用户

Future.get上的阻塞调用似乎效率很低

是的,我将在下面介绍,但也要注意,如果这是一个批量操作,那么您的代码仍然会阻塞一点。对于单个add操作,您编写的代码可能只会阻塞第一个操作,因为在这之后,所有其他操作都已经完成,因此在第一个调用之后对Future.get的调用将立即返回

那么有更好的方法吗

您可以扩展MemcachedClient类,复制一个现有函数,并将自己的代码添加到回调函数中

此外,是否可能或计划实施以下操作

Spymemcached实现了memcached提供的所有功能。您提到的操作已经可以使用SpymeMached的功能进行构建

-添加或返回现有值

添加keyA。如果失败,请获取keyA

-如果值等于已知值,则删除

找凯亚。如果keyA等于已知值,则删除keyA

-如果值等于已知值,则设置

找凯亚。如果keyA等于已知值,则设置keyB

如果您希望在memcached中添加新的选项,那么您应该在memcached.org上发布您的请求。不过,老实说,memcached的家伙喜欢让api尽可能小,所以我认为它们不太可能被添加