2012-11-30 33 views
11

我正在開發一個用於學習Apache Cassandra和Java EE 6的小型Web應用程序。 Cassandra版本是1.1.6。Apache Cassandra從計數器中刪除

有一個問題,快把我逼瘋了...... 我創建了一個表,計數器

CREATE TABLE test (
    author varchar PRIMARY KEY, 
    tot counter 
) 

,並把一些價值這種方式(使用cqlsh v 3.0.0。):

update test set tot = tot +1 where author = 'myAuthor'; 

列家族是完全更新

author | tot 
----------+----- 
myAuthor | 1 

但是,如果你嘗試刪除該行和T母雞再次更新(使用相同的密鑰),然後沒有任何反應!該表不再更新,我不明白爲什麼:在我看來,一旦你使用了一個鍵,而不能再使用它。 我在datasax文檔(http://www.datastax.com/docs/1.1/references/cql/cql_lexicon)中尋找線索,但未能找到解決方案。

有人可以幫助我嗎? 預先感謝

+0

如果我想改變計數器的值,我必須更新計數器 更新_table_設置_counter_ = _counter_ -1 但我的問題是:爲什麼我不能用刪除鍵沒有更多? – besil

回答

15

卡桑德拉對刪除計數器有一些嚴格的限制。你不能真的刪除一個計數器,然後在短時間內再次使用它。從Cassandra wiki

計數器的去除本質上是有限的。例如,如果您非常快速地發出序列「增量,刪除,增量」,刪除操作可能會丟失(如果由於某種原因刪除恰好是最後收到的消息)。因此,刪除計數器僅用於確定刪除,即刪除的計數器之後不增加。這也適用於行刪除:如果刪除一行計數器,則增加該行中的任何計數器(在刪除之前存在)將導致未確定的行爲。請注意,如果你需要重置一個計數器,那麼一個選項(不幸的是不是併發安全的)可能是讀取它的值並添加-value。

+0

如果您在閱讀本文之前刪除了該行,您如何解決該問題? – OrangeDog

1

要重新添加刪除計數鍵的解決方法是清除它的所有記錄從表:

nodetool repair $table 
cqlsh -c "ALTER TABLE $table WITH gc_grace_seconds=1;" 
sleep 1 
nodetool compact $table 

你可以想像,這是不是一個真正的系統實用,或許應該如果某個重要計數器被意外刪除,則應預留給緊急情況。

最好確保永遠不會發生。