反转Cassandra索引

问题

通过前面的文章:《谈谈Cassandra的客户端》和《大话Cassandra数据模型》我们已经了解了Cassandra的数据模型和编程接口的情况。

假如我们在实际的应用中我们的数据是这样保存的:

image

每一个key对应了一些列的Column:port,Version,Service,Status等等。

通过某一个key,我们能够找到和这个key相关的所有Column的值。

假设我们要找到Column的name为Service,并且Column的值为app2的所有的Key值,那么我们应该如何操作呢?

根据Cassandra提供的Thrift API,我们并不能够直接找到这样的数据,唯一可以操作的方式就是通过KeyRange的方式:进行全表扫描,找到符合条件的值。

这种方式虽然可以解决问题,但是当数据量非常巨大的时候,进行这种查询的效率还是非常有限的。

解决

我们可以考虑使用反转索引的办法来解决这类的查询问题。

在原先数据模型的基础之上,我们根据实际的查询需求,建立以下额外的数据

image

我们建立key为Service=app2,然后对应的值为key2。

这样,当我们需要查询所有的Column的name为Service,并且Column的值为app2的所有的Key值时候,我们可以直接将Service=app2作为key传给Cassandra,然后就可以获得所有相应的key了。

当我们想知道这样的key中其他的Column值的时候,只要根据上一步找到的key,再次执行查询即可。

同样,我们想知道有Column的name为Service1的所有Key值时候,我们可以直接将Service1作为key传给Cassandra,然后就可以获得所有相应的key了。

这种方案的局限在于,如果需要索引的值越多,需要的额外空间就越大,同时当被索引的值进行修改的时候,索引的值也要同步进行修改。

还有一种方式。可以考虑使用Lucandra。在这篇文章中就不详细介绍了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值