2013-05-14 86 views
11

我知道Cassandra中的列上有TTL。但是,是否也可以在一行上設置TTL?在每列上設置TTL並不能解決我的問題,這可以在以下用例中看到:Cassandra ttl on row

某個進程想要刪除一個帶有TTL的完整行(假設行「A」,TTL爲1周)。它可以通過替換具有相同內容的所有現有列來實現,但TTL爲1周。

有可能是該行「A」這將插入新的列或替換現有的不帶TTL因爲這個過程會不知道這行要被刪除的同時運行的另一個進程(它同時運行! )。因此,在1周之後,除了這些新插入的列以外,「A」行的所有列將被刪除,因爲TTL。我也希望他們被刪除。

那麼是否會有Cassandra支持這個用例,還是我必須自己實現一些東西?

親切的問候
斯特凡

+0

作爲一個答案理查德提到的TTL設置爲一排,我們並不真正需要在行上的所有數據的TTL。從我們的討論中可以看出,在將來(即1周)刪除所有達到給定時間戳的數據並且在一列上具有ttl就足夠了。 – std 2013-05-16 14:28:39

回答

10

沒有在卡桑德拉目前一排設置TTL方式。 TTL被設計用於刪除單個列,當它們的寫入時間已知它們的生命週期時。

你可以通過延遲你的過程來實現你想要的 - 而不是想插入1周的TTL,一週後運行它並刪除該行。行刪除具有以下語義:之前插入的任何列都將被刪除,但剛剛插入的列將不會被刪除。

如果未來插入的列仍然需要刪除,您可以在將來插入帶有時間戳的行刪除,以確保這一點,但要非常小心:如果您以後想要插入該行,則無法,寫入該行時列將消失(直到墓碑被垃圾收集)。

+0

在未來用時間戳刪除的想法很有趣。但遺憾的是,我不知道可能插入的所有列的名稱。 – std 2013-05-16 09:54:12

+0

使用行刪除時,不需要知道列的名稱。 – Richard 2013-05-16 10:24:06

+0

Aaah,好吧:)我剛剛檢查過它。我不知道這會起作用。 我想我們會這樣使用它: 我們將在未來(1周)刪除帶有時間戳的行,並插入帶有相同時間戳和TTL的DELETED標記,並在此之後過期。 因此,將來的刪除操作也會從併發進程中刪除更新,而DELETED標記可防止其他人插入到已刪除的行中。 DELETED標記過期後,該行可以再次使用。尼斯。謝謝你的提示。 – std 2013-05-16 13:45:10

1

雖然我不建議這樣的,有一個卡桑德拉方式來解決這個問題:

SELECT TTL(value) FROM table WHERE ...; 

得到一個值的當前TTL第一,然後用結果來設置TTL在INSERT或UPDATE:

INSERT ... USING TTL ttl-of-value; 

所以......我認爲SELECT TTL()慢(從TTL()和WRITETIME()在我的一些CQL命令的經驗)。不僅如此,在Cassandra節點上生成選擇結果時,TTL是正確的,但是在插入發生時,TTL將關閉。卡桑德拉應該已經提供了一個時間刪除而非生存時間 ...

因此,作爲由Richard提到的,擁有自己的過程,1周後刪除數據可能是更安全的。您應該有一列來保存創建日期或數據過時的日期。然後後臺進程可以讀取該日期,如果數據被視爲已過時,則刪除整行。

其他進程也可以使用該日期來知道該行是否被認爲有效! (所以即使它還沒有被刪除,如果日期通過,仍然可以將該行視爲無效。)

4

您可以在卡桑德拉3使用

INSERT INTO Counter(key,eventTime,value) VALUES ('1001',dateof(now()),100) USING ttl 10; 
+1

它不服務提問者的用例。如果你更新一列,它的ttl將被改變(如果你沒有在更新查詢中指定任何ttl,它將爲空)。因此,行將在ttl過期後與更新的列一起存在。 – 2016-11-14 09:04:15