如何在Cassandra中添加最后一行的行键

时间:2012-05-11 05:50:19

标签: cassandra thrift

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

3 个答案:

答案 0 :(得分:3)

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

  1. 一个天真的解决方案是将最后插入的密钥存储在文件中 或者某种类似的手段。不要为此考虑cassandra:P
  2. 如果您想要坚持使用cassandra,请将所有插入的原始CF(OCF)行键作为列存储在临时CF(TCF)中。确保您的TCF的comparator与您的key_validation_class OCF相同
  3. 解决方案2会将OCF的最后插入的row_key保留为TCF中行的最后一列。您可以在列上使用反向范围切片来获取最后一个;)

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

    您可以使用列的expiry属性控制Temporary_CF中行的大小,并以这种方式对数据建模可以为您提供在最后插入n row_keys的选项。

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

如果你绝对需要知道节点网络中时间戳细节下面的最后一行......我什么都想不到。

但cassandra通过最近时间戳获胜来解决竞争单元格(行+列)更新,因此对于所有插入,还会更新与该表对应的单个行中的单个列,并使用ALL查询该单元格。我建议每个columnfamily / table使用一个不同的行,以防止这一行的更新过多地造成瓶颈。

如果有两个相同的同时时间戳更新......好吧,那时我们可能会遇到哲学问题。除非你想要网络序列生成器的一些减速点,这很糟糕。

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