我目前正在编写一个需要在键/值存储上进行批量操作的应用程序,此时我正在使用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()的阻塞调用似乎非常低效,有更好的方法吗?在我的实际情况中,我希望能够在它们返回后立即处理期货(可能会或可能不会按照它们的发送顺序进行处理?)。
此外,以下操作是否可行(或计划实施)?
- 添加或返回现有值
- 如果值等于已知值,则删除
- 如果值等于已知值
,则设置谢谢, 马库斯
答案 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,所以我不认为这些可能会增加。