15

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

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

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

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

亲切的问候
斯特凡

4

3 回答 3

13

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

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

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

于 2013-05-15T07:42:24.533 回答
8

您可以使用 Cassandra 3 为一行设置 ttl

INSERT INTO Counter(key,eventTime,value) VALUES ('1001',dateof(now()),100) USING ttl 10;
于 2016-08-22T09:04:14.103 回答
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 应该提供一个删除的时间而不是一个生存的时间......

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

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

于 2016-07-05T18:56:25.353 回答