原文链接: http://xulingbo.net
一、 Cassandra 数据失效机制
现在使用 Cassandra 的地方很多,由于 Cassandra 的写的性能很好,所以有一部分使用 Cassandra 做为类似于日志功能来使用,所
以一个需求就提出来了,那就是希望 Cassandra 能提供一个自动失效功能,希望 Cassandra 能保留一定天数后,能自动删除数据。
这种需求的确很常见,但是遗憾的是Cassandra 目前仍然不能满足这个需求,虽然Cassandra 已经提供了实现这个功能的基础,下面详细看一下Cassandra 是怎么删除数据的:在我写的另一篇文章中也介绍了Cassandra 删除数据的规则《Cassandra 分布式数据库详解》系列文档。
Cassandra 判断数据是否有效有三个地方,分别是下面代码片段:
第一段代码
long maxChange = column.mostRecentLiveChangeAt();
return (!column.isMarkedForDelete() || column.getLocalDeletionTime() >
gcBefore || maxChange > column.getMarkedForDeleteAt()) // (1)
&& (!container.isMarkedForDelete() || maxChange >
container.getMarkedForDeleteAt()); //(2)
这段代码判断这个列是否应该被关联,关联有两个条件
(1) 列没有被删除或者删除的时间在有效期以内或者删除的时间在最后修改数据的数据之前
(2) 列所在的容器没有被删除或者列的修改时间在容器删除时间之后
第二段代码
for (byte[] cname : cf.getColumnNames())
{
IColumn c = cf.getColumnsMap().get(cname);
long minTimestamp = Math.max(c.getMarkedForDeleteAt(),
cf.getMarkedForDeleteAt());
for (IColumn subColumn : c.getSubColumns())
{
if (subColumn.timestamp() <= minTimestamp|| (subColumn.isMarkedForDelete() && subColumn.getLocalDeletionTime()<= gcBefore))
{
((SuperColumn)c).remove(subColumn.name());
}
}
if (c.getSubColumns().isEmpty() && c.getLocalDeletionTime() <=
gcBefore)
{
cf.remove(c.name());
}
}
或
for (byte[] cname : cf.getColumnNames())
{
IColumn c = cf.getColumnsMap().get(cname);
if ((c.isMarkedForDelete() && c.getLocalDeletionTime() <= gcBefore)
|| c.timestamp() <= cf.getMarkedForDeleteAt())
{
cf.remove(cname);
}
}
if (cf.getColumnCount() &