您是否可以通过为每个列条目创建的Timestamp值而不是列Keys键对Cassandra列族进行GET排序?

时间:2011-06-13 02:16:42

标签: sorting timestamp cassandra

基本上我有一个“线程”,其中创建了新线程,并将TimeUUID用作键。这显然很容易提供新线程的排序,特别是在查询最新的20个线程等时。

我的问题是,当一个新的'post'被创建到一个线程时,我希望能够将该线程“碰撞”到问题所在的“线程”的前面,我该如何基本上实现这一点,我仍然可以进行仍然可以按正确的顺序选择的查询,而不提供任何类型的重复等。

我能看到这个工作的唯一方法是,如果不是通过TimeUUID对列系列进行排序,我需要通过插入时间戳对列族进行排序,因此我可以使用列键的唯一线程ID并在是否插入或重新插入它们而不是TimeUUID?这是可能的还是我错过了一个允许这个的简单技巧?据我所知,你必须设置一个特定的比较器,否则它默认为字节?

1 个答案:

答案 0 :(得分:5)

行中的列始终按名称使用给定的比较器进行排序。您无法按时间戳或值或其他任何内容进行排序,或者Cassandra无法正确地将多个更新合并到同一列。

至于你的用例,我可以想到两个选择。

与你现在正在做的最相似的是创建第二个列家族,ThreadMostRecentPosts,带有timeuuid列(你说“键”,但听起来你的意思是“列”)。当新帖子到达时,删除旧的最新列并添加一个新列。

这有两个问题:

  • 复制单元是行,因此无限增长可能会有问题。 (使用expiring columns使不再相关的线程信息老化可能会有所帮助。)
  • 您需要一个锁定管理器,以便同一个线程的多个帖子不会竞争,并且可能会在此行中留下多个条目。

我建议每天创建一行(例如),其列是线程ID,其值是最新的帖子。添加新帖子只会更新该列中的值;没有删除/重新添加,所以比赛不再是问题。你不再免费进行排序,但这没关系,因为你将它限制在一个足够小的集合中,你可以在内存中进行排序(比如昨天的线程和今天的)。

(最后,我想补充一点,我可以从经验中说,过了一个旧的线程没有被新的回复碰到前面的截止是好事。)