さくら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つづつ設定する形にしました。