如何使用Cassandra中其他列的相同TTL向集合添加元素

如何使用Cassandra中其他列的相同TTL向集合添加元素,cassandra,ttl,Cassandra,Ttl,我有一张桌子 CREATE TABLE myTable ( id bigint, other_id text, my_set SET<bigint>, my_date timestamp, PRIMARY KEY (id, other_id) ); 我还可以通过添加以下新元素来更新我的集合: UPDATE myTable USING TTL 20 SET my_set=my_set + {99}

我有一张桌子

CREATE TABLE myTable (
    id bigint,
    other_id text,
    my_set SET<bigint>,
    my_date timestamp,
    PRIMARY KEY (id, other_id)
);
我还可以通过添加以下新元素来更新我的集合:

UPDATE myTable USING TTL 20 SET my_set=my_set + {99}
                             WHERE id=1 AND other_id='foo';
但我的问题是,这个新元素有一个新的TTL,所以过了一段时间,数字22消失了,99仍然存在

如何使用集合中其他元素的相同TTL向集合中添加新元素?

我想到的解决方案是提出两个问题:

  • 询问我的日期栏他的TTL
  • 有了这个TTL,我可以在我的集合中添加一个新元素来进行更新
  • 有更好的解决方案吗?

    您可以在
    选择中使用
    TTL()
    函数

    SELECT TTL(my_set) FROM myTable;
    
    然后使用该值。。。但我认为这对你正在努力做的事情不起作用

    相反,我将添加创建行的日期。或多或少,像这样的:

    CREATE TABLE myTable (..., created_on timestamp);
    INSERT INTO myTable (..., created_on) VALUES (..., toTimestamp(now()));
    ...
    SELECT created_on FROM myTable WHERE ...
    INSERT INTO myTable ... USING TTL now - created_on ...
    
    (您可能需要使用
    dateOf(now())
    而不是
    toTimestamp(now())
    ,具体取决于您使用的CQL版本;当然,您也可以使用自己的时间戳值。)

    如果
    上现在创建的
    小于1,则不应处理该插入。(实际上,我在某个地方读到,TTL的最小值应该至少为3秒,但对于数据库TTL来说,即使是3秒也非常小……)

    还有一个
    writetime()
    函数。但我不太确定这是否对你有用。您当然可以尝试一下:

    SELECT writetime(id) FROM myTable WHERE ...
    

    writetime()
    不太可能在更新时更改,但我不知道它是按列还是按行更改的,不建议将此类系统信息用于您自己的数据()。

    我不太了解您的解决方案试图实现的目标。但根据我的经验,大型集合中的TTL是个坏消息(或者集合中有几十个以上的元素)

    无论如何,因为下面的覆盖集是以(name=setName:valueOfItem,value=)()的形式作为离散列实现的,所以您必须在上面修改一些内容。我的建议是将您的收藏封装在一个集群列中,如下所示:

    CREATE TABLE my_table (
        id bigint,
        other_id text,
        collection_ttl timeuuid,
        my_set SET<bigint>,
        my_date timestamp,
        PRIMARY KEY (id, other_id, collection_ttl)
    );
    

    如果您有一个相当大的收藏,这对Cassandra会更友好,您可以对订单id或类似的东西进行TTL。

    Hi@fromanator,谢谢您的回答!。我将使用100-150个元素的集合。我想我会赞成你提出的第一个选择。你认为场景中的100-150个元素会影响卡桑德拉的表现吗?很难说,我只见过1000件左右的作品表现不佳。一般来说,卡桑德拉的藏品仅用于“少量”物品。Casssandra阅读整个集合(即使您只需要其中的一项)。如果您的用例涉及读取集合中的1个或多个数据范围,那么您通常最好使用聚类列“展开”集合,如我的第二个示例所示。非常感谢@fromanator,我必须读取集合的所有值,所以我认为在我的特殊情况下也是一样的。我会记住你的评论,以防我只需要阅读一些值。
    CREATE TABLE my_table (
        id bigint,
        other_id text,
        collection_ttl timeuuid,
        my_set SET<bigint>,
        my_date timestamp,
        PRIMARY KEY (id, other_id, collection_ttl)
    );
    
    CREATE TABLE my_table_no_set (
        id bigint,
        other_id text,
        my_set_key bigint,
        my_set_value text,
        my_date timestamp,
        PRIMARY KEY (id, other_id, my_set_value)
    );