2011-08-17 81 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,所以我不認爲這可能會得到補充。