如何在一定时间间隔后更改列值 - Cassandra

时间:2017-06-06 06:42:58

标签: cassandra datastax-enterprise cassandra-2.1 spring-data-cassandra

我在Cassandra有一个列族,其中一个列名是状态,值为Y.如果没有更新为其他值,则必须将此状态更新为新值 - 30分钟后为X.在30分钟内。

基本上,如果在指定的时间间隔内没有任何更新,我想将列标记为Expired - X.

此外,一旦过期,它需要触发事件以通知另一个系统(API)说它已过期。

2 个答案:

答案 0 :(得分:2)

您可以尝试Cassandra的TTL(生存时间)功能

  

您可以为列中的数据(计数器列除外)设置一个名为TTL(生存时间)的可选有效期。列的TTL值是秒数。在列创建超过TTL值后的秒数之后,TTL数据被认为已过期并包含在结果中

每次更新字段时,请使用30分钟或1800秒的TTL

示例:

UPDATE users USING TTL 1800 SET password = 'ch@ngem4a' WHERE user_name = 'cbrown';

首次插入时,也请使用上述查询。

因此,对于上面的示例,如果30分钟内没有更新,密码字段将在30分钟后标记为已删除。

但是无法触发事件来通知您的系统。

注意: TTL或删除生成墓碑,大量的墓碑可能会降低您的阅读效果

Read More about tombstone

答案 1 :(得分:1)

同意Ashraful的回答。如果您使用Spring Data for Apache Cassandra 2.0(目前里程碑),那么您将使用以下代码来实现Ashraful的示例:

@Table("users")
public class User {

    @PrimaryKey("user_name")
    String userName;
    String password;
}

WriteOptions options = WriteOptions.builder().ttl(1800).build();

template.update(query(where("userName").is("cbrown")).queryOptions(options), 
                update("password", "ch@ngem4a"), 
                User.class);