反转Cassandra索引
问题
通过前面的文章:《谈谈Cassandra的客户端》和《大话Cassandra数据模型》我们已经了解了Cassandra的数据模型和编程接口的情况。
假如我们在实际的应用中我们的数据是这样保存的:
每一个key对应了一些列的Column:port,Version,Service,Status等等。
通过某一个key,我们能够找到和这个key相关的所有Column的值。
假设我们要找到Column的name为Service,并且Column的值为app2的所有的Key值,那么我们应该如何操作呢?
根据Cassandra提供的Thrift API,我们并不能够直接找到这样的数据,唯一可以操作的方式就是通过KeyRange的方式:进行全表扫描,找到符合条件的值。
这种方式虽然可以解决问题,但是当数据量非常巨大的时候,进行这种查询的效率还是非常有限的。
解决
我们可以考虑使用反转索引的办法来解决这类的查询问题。
在原先数据模型的基础之上,我们根据实际的查询需求,建立以下额外的数据
我们建立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/