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

问题描述

| 基本上,我有一个“线程行”,用于创建新线程,并将TimeUUID用作键。显然,这很容易提供对新线程的排序,尤其是当说查询最近的20个线程等时。 我的问题是,当对一个线程进行新的“发布”时,我希望能够将该线程“碰撞”到问题所在的“线程行”的前面,我是否基本上做到了这一点,所以我仍然可以进行仍可以按正确顺序选择的查询,而无需提供任何重复等。 我看到此工作的唯一方式是,如果不是通过TimeUUID对列族进行排序,我需要通过插入时间戳来对列族进行排序,因此我可以对列键使用唯一的线程ID,并按它们的顺序检索它们。插入或重新插入,而不是通过TimeUUID插入?这可能吗?或者我错过了一个简单的技巧来做到这一点?据我所知,您必须设置一个特定的比较器,否则认为字节?     

解决方法

        行中的列始终使用给定的比较器按名称排序。您无法按时间戳或值或其他任何内容进行排序,否则Cassandra无法将多个更新正确合并到同一列。 至于您的用例,我可以想到两个选择。 与您现在执行的操作最相似的是创建第二个列家族ThreadMostRecentPosts,其中包含timeuuid列(您说的是“键”,但这听起来像是指“列”)。收到新帖子时,请删除最旧的最新列并添加一个新帖子。 这有两个问题: 复制的单位是行,因此无限地增加它可能会出现问题。 (使用过期的列来老化不再相关的线程信息可能会有所帮助。) 您需要一个锁管理器,以便同一线程的多个帖子不会争用,并可能在该行中保留多个条目。 我建议改为每天创建一行,例如,其行是线程ID,其值是最新的帖子。添加新帖子只会更新该列中的值;没有删除/重新添加操作,因此比赛不再是问题。您不再需要免费进行排序,但是没关系,因为您将其限制为一个足够小的集合,可以在内存中进行排序(例如,昨天的线程和今天的线程) 。 (最后,我要补充一点,我可以从经验中说,中断一个旧线程不会被新的回复撞到前面是件好事。)