我目前正在编写一个需要对键/值存储进行批量操作的应用程序,目前我使用的是membase。
spymemcached允许批量获取,但不允许批量CAS或add;我认为如果实现这些功能,将会得到广泛使用。
此时,我的一组批量操作的代码大致如下所示。
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()上的阻塞调用似乎效率很低,有没有更好的方法?在我的实际场景中,我希望能够在期货返回时立即处理它们(这可能是也可能不是发送的顺序?)。
另外,以下操作是否可能(或计划实现)?
-Add或返回现有值
如果值等于已知值,则返回-Delete
如果值等于已知值,则返回-Set
谢谢,马库斯
发布于 2011-08-18 08:16:49
我将在这里尝试解决尽可能多的事情。
Spymemcached允许批量获取,但不允许批量CAS或add;我认为如果实现这些功能,将会得到广泛使用。
我完全同意这一点,但我们可能不会通过添加bulkAdd、bulkCas等来实现这一点。函数添加到MemcachedClient。Spymemcached目前,默认情况下,通过尽可能将get和set操作作为批量集或批量get发送来优化get和set操作。有计划将其扩展到所有memcached操作,但还没有完成。然而,当它发生时,它将在幕后发生,并且可能不会直接提供给spymemcached用户。
Future.get()上的阻塞调用似乎非常低效?
是的,我将在下面解决这个问题,但也要注意,如果这是一个批量操作,那么您的代码仍然会阻塞一小段时间。对于单独的add操作,您的代码可能只会阻塞第一个操作,因为在此之后,所有其他操作都已经完成,所以在第一次调用之后调用Future.get()将立即返回。
那么有没有更好的方法呢?
您可以扩展MemcachedClient类并复制其中一个现有函数,然后将自己的代码添加到回调函数中。
另外,以下操作是否可能(或计划实现)?
Spymemcached实现了memcached提供的所有功能。您提到的操作可以使用Spymemcached所具有的功能进行构建。
-Add或返回现有值
添加keyA。如果失败,则获取keyA。
如果值等于已知值,则返回-Delete
叫上keyA。如果keyA等于已知值,请删除keyA
如果值等于已知值,则返回-Set
叫上keyA。如果keyA等于一个已知值,则设置keyB。
如果你想把新的选项添加到memcached中,那么你应该在memcached.org上发布你的请求。不过,老实说,memcached的人喜欢保持尽可能小的api,所以我认为不太可能添加这些api。
https://stackoverflow.com/questions/7095771
复制相似问题