假设使用 OrderPreservingPartitioner 并且 rowkeys 严格按升序排列,是否有一种简单的方法可以使用 Cassandra 客户端获取最近添加的行的 row key?我知道我可以执行 get_range_slices 查询来获取所有行并迭代到最后以找到最后一个行键。但我觉得这将是一个耗时的操作。
3 回答
我认为不可能获得最后插入的行键,即使它们按升序排列并且使用了 OPP。
- 一个天真的解决方案是将最后插入的密钥存储在文件中或类似的方式。不要为此考虑卡桑德拉:P
- 如果您想使用 cassandra,最好将所有插入的原始 CF (OCF) 行键作为列存储在临时 CF (TCF) 中。确保
comparator
您的 TCF 与您key_validation_class
的 OCF相同
解决方案 2 会将 OCF 最后插入的 row_key 保留为 TCF 中一行的最后一列。您可以在列上使用反向范围切片从最后一个获取第一个;)
SELECT FIRST 1 REVERSED * from TCF where KEY='yourkey'
您可以使用列的到期属性来控制 Temporary_CF 中行的大小,并以这种方式对数据进行建模,您也可以选择在最后插入 n 个 row_key。
SELECT FIRST N REVERSED * from TCF where KEY='yourkey'
使用模式:我们经常需要加载最后添加的行
实现:在序列化之前“反转”RowKey;使用 OrderPreservingPartitioner;使用“时间戳”作为 RowKey。
例如,您的 RowKey 是一个长数字(代表时间戳)。然后,使用 reverted (Long.MAX_VALUE - timestamp) 对时间戳进行序列化。第一行将是插入的最后一行。
如果您绝对需要知道跨节点网络的时间戳详细信息下方的最后一行......我想不出任何东西。
但是 cassandra 通过最近的时间戳获胜来解决竞争单元格(行+列)更新,因此对于所有插入,还更新与该表对应的单行中的单个列,并使用 ALL 查询该单元格。我建议每个列族/表使用不同的行,以防止该行的更新成为瓶颈。
如果有两个相互竞争的相同时间戳更新......那么,我们可能会在这一点上解决哲学问题。除非你想要一个网络序列生成器的一些减速点,这很糟糕。
将一致性从 ALL 删除到 QUORUM 或 ONE 可能也会加快快速插入行的速度,具体取决于您需要结果的精确程度。