实现Cassandra数据自动失效功能

本文探讨了Cassandra数据失效机制的局限性,并提出了一种改造方案,通过新增`is_delete`属性支持自动失效功能。改造涉及客户端接口、服务器端多个类的方法调整,以及数据有效时间的设置,实现了超过`GCGraceSeconds`后数据自动被物理删除的目标。
摘要由CSDN通过智能技术生成
原文链接: 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() &

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值