2013-05-14 53 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