2012-05-11 26 views
4

假设使用OrderPreservingPartitioner并且rowkeys严格按升序排列,是否有一种简单的方法可以使用Cassandra客户端获取最近添加的行的行密钥?我知道我可以执行get_range_slices查询来获取所有行并迭代,直到找到最后一行键为止。但我觉得这将是一个耗时的操作。如何获取在Cassandra中添加的最后一行的行密钥

回答

3

即使按升序排列&使用OPP,我不认为有可能得到最后插入的rowkey。

  1. 一个天真的解决方案是将最后插入的密钥存储在文件 或类似的一些手段。不要联想到cassandra:P
  2. 如果您想卡住cassandra,最好将所有原始CF(OCF)插入的行键存储在临时CF(TCF)列中。请确保您的TCF的comparator是与您的OCF解决方案2将让您的OCF的最后插入row_key作为排在TCF最后一列的key_validation_class

。您可以使用反向范围切片上一列以获得从去年第一;)

SELECT FIRST 1 REVERSED * from TCF where KEY='yourkey' 

您可以控制使用列的到期财产Temporary_CF行的大小和数据建模这种方式可以给你一个选择最后还要插入n个row_keys。

SELECT FIRST N REVERSED * from TCF where KEY='yourkey' 
1

使用模式:我们经常需要加载最后添加的行

实施:序列化之前的 “反向” RowKey;使用OrderPreservingPartitioner;使用“timestamp”作为RowKey。

例如,您的RowKey是一个很长的数字(表示时间戳)。然后,使用还原的(Long.MAX_VALUE - timestamp)来序列化时间戳。第一行将是插入的最后一行。

0

如果您绝对需要知道节点网络中时间戳详细信息的最后一行......我无法想到任何事情。

但cassandra通过most-recent-timestamp-wins解决了竞争的单元(行+列)更新,所以对于所有插入也更新与该表对应的单个行中的单个列,并使用ALL查询该单元。我建议为每个columnfamily/table使用不同的行,以防止使一行的更新过多地成为瓶颈。

如果有两个相互竞争的相同时间戳更新......那么我们可能在这一点上是哲学问题。除非你想要网络化的序列发生器的一些放缓点,这很糟糕。

删除从ALL到QUORUM或ONE的一致性可能会加快速度行插入的速度,这取决于您需要的结果的确切程度。

相关问题