Cassandra在一排

nvbavucw  于 2021-06-15  发布在  Cassandra
关注(0)|答案(3)|浏览(337)

我知道在Cassandra的专栏里有TTL。但是否也可以在一行上设置ttl?在每一列上设置一个ttl并不能解决我的问题,这可以在下面的用例中看到:
在某个时刻,一个进程想要删除一个完整的带有ttl的行(比如说带有ttl的行“a”为1周)。它可以用相同的内容替换所有现有的列,但ttl为1周。
但可能有另一个进程在该行“a”上同时运行,它插入新列或替换现有列而不使用ttl,因为该进程无法知道该行将被删除(它同时运行!)。因此,1周后,行“a”的所有列都将被删除,因为ttl除了这些新插入的列。我也希望他们被删除。
那么这个用例是否有或将有cassandra支持,或者我是否必须自己实现一些东西?
谨致问候
斯特凡

bvjveswy

bvjveswy1#

您可以使用

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

tvz2xvvm2#

虽然我不建议这样做,但有一种cassandra方法可以解决这个问题:

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

首先获取值的当前ttl,然后使用结果在插入或更新中设置ttl:

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

所以。。。我认为 SELECT TTL() 速度很慢(根据我在一些cql命令中使用ttl()和writetime()的经验)。不仅如此,在cassandra节点上生成select结果时,ttl是正确的,但是在插入发生时,它将被关闭。Cassandra应该提供一个删除的时间而不是一个生存的时间。。。
所以正如richard所提到的,在一周后用自己的流程删除数据可能更安全。您应该有一列来保存创建日期或数据过时的日期。然后后台进程可以读取该日期,如果数据被视为过时,则删除整行。
其他进程也可以使用该日期来知道该行是否有效(因此,即使尚未删除该行,如果日期已过,您仍可以将该行视为无效。)

0kjbasz6

0kjbasz63#

目前没有办法在cassandra的行上设置ttl。ttl被设计用于在写入时知道单个列的生存期时删除它们。
您可以通过延迟进程来实现所需的功能—不要插入一周的ttl,而是在一周后运行它并删除该行。行删除具有以下语义:在前面插入的任何列都将被删除,而在后面插入的列则不会被删除。
如果将来插入的列仍然需要删除,您可以在将来插入一个带有时间戳的行delete来确保这一点,但要非常小心:如果以后要插入到该行中,您不能这样做,列在写入该行时将消失(直到墓碑被垃圾回收)。

相关问题