卡桑德拉ttl连续

时间:2013-05-14 13:07:22

标签: cassandra row ttl

我知道Cassandra中的列上有TTL。但是也可以在一行上设置TTL吗?在每列上设置TTL并不能解决我的问题,如以下用例所示:

在某些时候,某个进程想要删除一个带有TTL的完整行(假设行“A”,TTL为1周)。它可以通过使用相同内容替换所有现有列,但TTL为1周来实现此目的。

但是可能会在该行“A”上同时运行另一个进程,该行插入新列或替换现有的没有TTL的进程,因为该进程无法知道要删除该行(它同时运行!)。因此,在1周后,除了这些新插入的行之外,由于TTL,所有行“A”的列都将被删除。而且我也希望将它们删除。

那么Cassandra是否会支持这个用例,或者我必须自己实现一些东西?

亲切的问候 斯蒂芬

3 个答案:

答案 0 :(得分:11)

目前无法在Cassandra的行中设置TTL。 TTL设计用于在写入时知道其生命周期时删除单个列。

你可以通过延迟你的过程来实现你想要的 - 而不是想要插入1周的TTL,一周后运行它并删除该行。行删除具有以下语义:之前插入的任何列都将被删除,但之后插入的列将不会被删除。

如果以后插入的列仍然需要删除,您可以在将来插入带有时间戳的行删除以确保这一点但要非常小心:如果您以后想要插入该行,则不能,写入该行时,列会消失(直到墓碑被垃圾收集)。

答案 1 :(得分:6)

您可以使用

为Cassandra 3中的一行设置ttl
INSERT INTO Counter(key,eventTime,value) VALUES ('1001',dateof(now()),100) USING ttl 10;

答案 2 :(得分:1)

虽然我不建议这样做,但有 Cassandra方式来解决问题:

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

首先获取值的当前TTL,然后使用结果在INSERT或UPDATE中设置TTL:

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

所以......我认为SELECT TTL()很慢(根据我的一些CQL命令中的TTL()和WRITETIME()经验)。不仅如此,在Cassandra节点上生成选择结果时TTL是正确的,但是在插入发生时,它将关闭。 Cassandra应该提供时间来删除而不是时间来生活 ......

正如理查德所提到的,拥有自己的一周后删除数据的过程可能更安全。您应该有一列来保存创建日期或数据过时的日期。然后后台进程可以读取该日期,如果数据被视为过时,则删除整行。

其他进程也可以使用该日期来了解该行是否有效! (因此,即使它尚未删除,如果日期通过,您仍然可以将该行视为无效。)