0

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

spymemcached 允许批量获取,但不允许批量 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() 的阻塞调用似乎效率很低,有没有更好的方法?在我的实际场景中,我希望能够在它们返回后立即处理期货(这可能会或可能不会按照它们发送的顺序?)。

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

- 添加或返回现有值

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

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

谢谢,马库斯

4

1 回答 1

0

我将尝试在这里尽可能多地解决问题。

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

我完全同意这里,但我们可能不会通过向 MemcachedClient 添加 bulkAdd、bulkCas、... 函数来解决这个问题。目前,Spymemcached 默认优化 get 和 set 操作,尽可能将它们作为批量集或批量获取发送。有计划将此扩展到所有 memcached 操作,但尚未完成。虽然它会在幕后发生,并且可能不会直接提供给 spymemcached 用户。

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

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

那么有没有更好的方法呢?

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

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

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

- 添加或返回现有值

添加密钥A。如果失败则获取keyA。

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

获取密钥A。如果 keyA 等于已知值,则删除 keyA

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

获取密钥A。如果 keyA 等于已知值,则设置 keyB。

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

于 2011-08-18T00:16:48.770 回答