Java + Membase + spymemcached批量操作

时间:2011-08-17 15:51:45

标签: java cas bulk membase spymemcached

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

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()的阻塞调用似乎非常低效,有更好的方法吗?在我的实际情况中,我希望能够在它们返回后立即处理期货(可能会或可能不会按照它们的发送顺序进行处理?)。

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

- 添加或返回现有值

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

- 如果值等于已知值

,则设置

谢谢, 马库斯

1 个答案:

答案 0 :(得分:0)

我会尝试尽可能多地处理这些事情。

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

我在这里完全同意,但我们可能不会通过向MemcachedClient添加bulkAdd,bulkCas,...函数来解决这个问题。默认情况下,Spymemcached默认通过将它们作为批量集发送或批量获取来优化获取和设置操作。有计划将其扩展到所有memcached操作,但尚未完成。虽然它会在幕后发生,但可能无法直接用于spymemcached用户。

对Future.get()的阻塞调用似乎非常低效?

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

那么有更好的方法吗?

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

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

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

- 添加或返回现有值

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

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

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

- 如果值等于已知值

,则设置

获得keyA。如果keyA等于已知值,请设置keyB。

如果您希望将新选项添加​​到memcached,那么您应该在memcached.org上发布您的请求。老实说,memcached的人喜欢尽量减少api,所以我不认为这些可能会增加。