如何将元素添加到Cassandra中其他列的TTL相同的集合中



我有一个表

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

我希望在所有列中都有一个通用的TTL,这样在TTL过期后,行就会消失。

我设法用插入新行

INSERT INTO myTable (id, other_id, my_date, my_set) 
VALUES (1,'foo','2014-10-20 12:05:08-0300', {22}) 
USING TTL 20;

我也可以更新我的集合添加新的元素:

UPDATE myTable USING TTL 20 SET my_set=my_set + {99}
                             WHERE id=1 AND other_id='foo';

但我的问题是,这个新元素有一个新的TTL,所以过了一段时间,数字22消失了,99仍然存在。

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

我正在考虑的解决方案是进行两个查询:

  1. 询问我的日期栏他的TTL(_D)
  2. 使用该TTL,使UPDATE向my_set添加一个新元素

有更好的解决方案吗

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

无论如何,由于在封面下面,集合以(name=setName:valueOfItem,value=)的形式实现为离散列(有关更多信息,请参阅本文),您必须在顶部破解一些内容。我的建议是将您的Collection封装在一个集群列中,如下所示:

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)
);

其中collection_ttl可能只是插入时间,本质上是为了跟踪所包含collection的ttl。

或者,您可以将Set展开到一个Clustering列中,并通过以下操作实现本质上相同的事情:

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)
);

如果您有一个相当大的Collection,并且您可以对order_id或类似的内容执行TTL,那么这对Cassandra来说会友好得多。

您可以在SELECT 中使用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 ...

(根据您使用的CQL版本,您可能必须使用dateOf(now()),而不是toTimestamp(now());请参阅文档。当然,您也可以使用自己的时间戳值。)

如果now - created_on小于1,则不应处理该INSERT。(实际上,我在某个地方读到TTL的最小值可能至少应该是3秒,但对于数据库TTL来说,即使是3秒也很小…)

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

SELECT writetime(id) FROM myTable WHERE ...

writetime()在更新时更改的可能性不大,但我不知道它是按列还是按行更改,不建议将此类系统信息用于您自己的数据(如何从cassandra检索时间戳?)。

最新更新