さくらVPSでCassandra 0.7でexpiring columnsを試す。



What's new in Cassandra 0.7: expiring columns」を参考に試しました。

TTL(time to live?)を設定することにより、データに有効期限をもたせることができます。
有効期限を過ぎたデータは、自動的に消えるようです。
 

テストデータに関して

create keyspace test3;
use test3;
create column family test with comparator=UTF8Type and column_metadata=[{column_name:full_name, validation_class:UTF8Type},{column_name:birth_date, validation_class:LongType, index_type:KEYS}];
 
set test[row1][col1] = 'val1';
set test[row1][col2] = 'val2' with ttl=60;

上記の様なデータを作成しました。
 

cassandra CLIで有効期限データを試す

作成したデータを、時間をおいて確認しました。

[default@test3] list test;
Using default limit of 100
-------------------
RowKey: row1
=> (column=col1, value=val1, timestamp=1295857340216000)
=> (column=col2, value=val2, timestamp=1295857341460000, ttl=60)

1 Row Returned.
[default@test3] list test;
Using default limit of 100
-------------------
RowKey: row1
=> (column=col1, value=val1, timestamp=1295857340216000)

1 Row Returned.

1回目の「list test;」は、データ投入(set)直後になります。
2回目の「list test;」は、60秒後、確認をしました。
たしかに、「olumn=col2」のデータが削除されていることが確認できます。
 

プログラムでデータを作成時に、有効期限を設定してみる

「org.apache.cassandra.thrift.Column」クラスのコンストラクタは、下記の形になっています。

public Column()
public Column(ByteBuffer name, ByteBuffer value, long timestamp)
public Column(Column other)

Columnクラスのコンストラクタには、TTLを設定できるものがありませんでした。
その為、「apache-cassandra-0.7.0-src」をダウンロードし、ソースを眺めてみました。

ソースを眺めていると「public Column setTtl(int ttl)」というものがあり、このメソッドで
有効期限付きにできるようです。

public static Mutation toMutation2(final String name, final String value, final long timestamp, int ttl) throws UnsupportedEncodingException {

int defaultttl = 0;
if(ttl != 0) {
defaultttl = ttl;
}

System.out.printf("カラム名:[%s] 値:[%s] タイムスタンプ:[%s] ttl:[%s]",
name,
value,
timestamp,
ttl);
System.out.println(" ");

Mutation mutation = new Mutation();
ColumnOrSuperColumn csc = new ColumnOrSuperColumn();

Column column = new Column();
column.setName(ByteBuffer.wrap(name.getBytes("UTF-8")));
column.setValue(ByteBuffer.wrap(value.getBytes("UTF-8")));
column.setTimestamp(timestamp);
column.setTtl(defaultttl);

csc.setColumn(column);
mutation.setColumn_or_supercolumn(csc);
return mutation;
}

コンストラクタでは、TTLを設定できないので、空のColumnクラスを生成後、
1つづつ設定する形にしました。