首页 文章

Cassandra ttl连续

提问于
浏览
11

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

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

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

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

亲切的问候
斯特凡

3 回答

  • 11

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

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

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

  • 1

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

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

    虽然我不推荐这样,但有一种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 应该提供一个时间来删除而不是生活的时间......

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

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

相关问题