【问题标题】:How do you change a column value after a certain time interval - Cassandra在特定时间间隔后如何更改列值 - Cassandra
【发布时间】:2017-11-07 01:25:02
【问题描述】:

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

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

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

【问题讨论】:

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


    【解决方案1】:

    你可以试试 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 或删除会生成 tombstone,大量的 tombstone 会降低您的读取性能

    Read More about tombstone

    【讨论】:

    • 我已经考虑过 TTL。就像我上面提到的,我需要存在行,必须更新列值。可能是触发器之类的东西?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2021-10-27
      • 1970-01-01
      • 1970-01-01
      • 2017-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-23
      相关资源
      最近更新 更多