2011-08-17 54 views
0

我目前正在编写一个应用程序,需要对关键/值存储进行批量操作,此时我正在使用membase。Java + Membase + spymemcached批量操作

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

此时我的一组批量操作代码大致如下所示。

“client”是一个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()上的阻塞调用似乎效率很低,有没有更好的方法?在我的实际情况下,我希望能够在他们回来后立即处理期货(这可能会或可能不会按照他们发送的顺序)。

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

- 添加或返回现有值

-Delete如果值等于已知值

定式,如果值等于已知值

感谢, 马库斯

回答

0

我会尽力尽可能多地解决这些问题。

Spymemcached允许批量获取,但不是散装CAS或添加;如果实施,我认为这些功能将被广泛使用。

我完全同意这里,但我们可能不会通过向MemcachedClient添加bulkAdd,bulkCas ...函数来解决此问题。 Spymemcached目前默认情况下会优化获取和设置操作,方法是将它们作为批量设置发送,或者在可能的情况下批量发送。有计划将此扩展到所有memcached操作,但尚未完成。当它是在幕后发生时,可能不会直接提供给spymemcached用户。

Future.get()上的阻塞调用看起来效率很低?

是的,我将在下面解决,但也请注意,如果这是批量操作,那么您的代码仍然会阻塞一点。对于单独的添加操作,您的代码可能只会阻止第一个操作,因为之后所有其他操作都已经完成,因此在第一次调用之后对Future.get()的调用将立即返回。

那么还有更好的方法吗?

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

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

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

- 增加或返回现有值

add keyA。如果失败,获得keyA。

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

获得keyA。如果科亚等于已知值,删除科亚

定式,如果值等于已知值

得到科亚。如果keyA等于已知值,则设置keyB。

如果您希望获得添加到memcached的新选项,那么您应该在memcached.org上发布您的请求。说实话,memcached的人喜欢保持尽可能小的api,所以我不认为这可能会得到补充。