卡桑德拉时间戳+计数器

时间:2014-11-04 20:02:46

标签: cassandra cql

我目前难以理解如何在Cassandra中建模。

想要的是这样的:

create table counts(
    user varchar,
    last_event timestamp,
    event_count counter,
    primary key ((user))
);

这里的目标是以给定用户可以有效检索的方式存储这两个数据(event_count和last_event)。

此外,可能有多个线程同时写入此数据,因此处理该情况的计数器类型非常有用。

但是,我知道在同一个表中组合计数器和时间戳是不可能的。还有其他一些替代方法可以对这些可行的数据进行建模吗?

我意识到我可以将所有事件存储为自己的行,但我们需要能够快速有效地检索给定用户的last_event和event_count。

为清晰起见编辑:我有一个与用户关联的时间戳流。我希望存储每个用户的时间戳总数和最新时间​​戳,我想优化快速查找特定用户。

1 个答案:

答案 0 :(得分:2)

只需制作主键(user,timestamp)即可。这将为每个用户创建一个单独的分区,分区中的每个计数器将按最后一个事件的时间戳排序。

create table counts(    
    user varchar,     
    last_event timestamp,     
    event_count counter,     
    primary key (user, last_event) );

您的分区看起来像

[username -> [time1, counter] , [time2, counter] .... ]

编辑:

更新后的问题有几种解决方案。我认为最简单的方法是使用两个表。

create table lastEvent (
   user varchar,
   event timeuuid, // Time uuid to avoid collosions
   event_data, // Anything else you want to retreive with the last event
   PRIMARY KEY (user,event)
)

此表负责按时间顺序跟踪事件。通过降序时间戳排序时从此表中选择将允许我们检索最近的事件。我们将这与我们保存在下表中的状态信息分开

create table eventsPerUser (
   user varchar,
   eventcount counter,
   PRIMARY KE (user)
)

此事件只是用户之间的查找以及所述用户发生了多少事件。

您可以在应用程序中同时更新这两个表。