只需将TTL设置为一行即可

时间:2016-11-21 22:23:37

标签: cassandra

使用Java,我可以扫描Cassandra表并只更新一行的TTL吗?我不想改变任何数据。我只想扫描Cassandra表并设置几行的TTL。

另外,使用java,我可以设置绝对的TTL。例如(2016-11-22 00:00:00)。所以我不想以秒为单位指定TTL,而是指定时间的绝对值。

3 个答案:

答案 0 :(得分:10)

Cassandra不允许设置的TTL值,它只允许为列设置TTL。

如果您想知道为什么 体验 到期,这是因为如果所有记录的所有列的值都是TTL,然后当您尝试SELECT时,该行会消失。

但是,只有使用INSERT执行USING TTL时才会出现这种情况。如果您INSERT没有TTL,然后使用TTL执行UPDATE,您仍会看到该行,但是会显示空值。以下是一些示例和一些问题:

仅限TTL INSERT的示例:

CREATE TABLE test (
    k text PRIMARY KEY,
    v int,
);

INSERT INTO test (k,v) VALUES ('test', 1) USING TTL 10;

... 10 seconds after...

SELECT * FROM test ;

 k             | v
---------------+---------------

TTL INSERT和TTL UPDATE的示例:

INSERT INTO test (k,v) VALUES ('test', 1) USING TTL 10;
UPDATE test USING TTL 10 SET v=0 WHERE k='test';

... 10 seconds after...

SELECT * FROM test;

 k             | v
---------------+---------------

带有TTL INSERT

的非TTL UPDATE的示例
INSERT INTO test (k,v) VALUES ('test', 1);
UPDATE test USING TTL 10 SET v=0 WHERE k='test';

... 10 seconds after...

SELECT * FROM test;

 k             | v
---------------+---------------
          test |          null

现在您可以看到解决问题的唯一方法是使用新的TTL重写所有行的所有列的值。

此外,无法指定明确的到期日期,但您可以使用简单的数学(如其他建议的那样)在中获得简单的TTL值。< / p>

查看有关数据过期的官方documentation。不要忘记查看更新TTL的DELETE部分。

HTH。

答案 1 :(得分:2)

您不仅可以更新一行的TTL。您必须更新或重新插入所有列。

您可以选择所有常规列和主键列,然后使用主键更新常规列,或使用第二个TTL重新插入

在Java中,您可以使用以下方法从日期开始计算TTL。

public static long ttlFromDate(Date ttlDate) throws Exception {
    long ttl = (ttlDate.getTime() - System.currentTimeMillis()) / 1000;
    if (ttl < 1) {
        throw new Exception("Invalid ttl date");
    }
    return ttl;
}

答案 2 :(得分:0)

或者,您可以在创建整个表时为其设置TTL值。

CREATE TABLE test (
    k text PRIMARY KEY,
    v int,
) WITH default_time_to_live = 63113904;

上面的示例将创建一个表,该表的行将在2年后消失。