逖靖寒的世界

每天进步一点点

导航

反转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。在这篇文章中就不详细介绍了。

 

更多关于Cassandra的文章:http://www.cnblogs.com/gpcuster/tag/Cassandra/

posted on 2010-05-26 08:29  逖靖寒  阅读(3219)  评论(3编辑  收藏