更好>触发器或TTL

时间:2019-08-07 08:34:02

标签: cassandra triggers ttl

我需要知道哪一个性能更好 触发器|| TTL?

或者它们当中哪个更方便使用。

1 个答案:

答案 0 :(得分:2)

因此,尽管“更好”绝对是主观的,但我在这里要做的是谈论在Cassandra中同时启用TTL和触发器所需要做的事情。然后,您可以自己决定。

要实现TTL,您需要将表上的default_time_to_live属性修改为一个值(以秒为单位),该值从写入时间到应删除该数据的时间开始。它的默认值为零(0),有效地禁用了该表的TTL。以下CQL将TTL设置为7天:

ALTER TABLE my_keyspace_name.my_table_name WITH default_time_to_live = 604800;

请注意,TTL数据仍然会创建逻辑删除,因此请注意这一点。它最适合于时间序列用例,在这些情况下,数据按timestamp结束顺序按timeUUID / DESC进行聚类。降序部分是关键,因为这会将您的墓碑保持在分区的“底部”,因此对最近数据的查询永远都不会遇到它们。

实施触发器要复杂一些。对于初学者,您需要编写一个implements ITrigger接口的类。该类还需要重载augment方法,如下所示:

public class MyTrigger implements ITrigger {
    public Collection<RowMutation> augment(ByteBuffer key, ColumnFamily update)

在该方法中,您需要从update元数据中获取表和键空间名称,并构建DELETE语句:

{
    String keyspace = update.metadata().ksName;
    String table = update.metadata().cfName;

    StringBuilder strCQLHeader = new StringBuilder("DELETE FROM ")
        .append(keyspace)
        .append(".")
        .append(table)
        .append(" WHERE ");

...还有一些逻辑来获取要删除/移动的键值以及您在此处需要执行的其他任何操作。

接下来,您需要将该类构建到JAR中,并将其复制到$CASSANDRA_HOME/lib/triggers/目录中。

然后(是,尚未完成),您需要将该触发器类添加到表中:

CREATE TRIGGER myTrigger ON my_table_name USING 'com.yourcompany.packagename.MyTrigger';

尽管您可以自由选择最适合自己的一个,但我强烈建议您使用TTL。在Cassandra中实现触发器是那些往往处于“疯狂”难度下的事情之一。