【问题标题】:Cassandra: List recent coversations for a userCassandra:列出用户最近的对话
【发布时间】:2017-05-22 00:31:28
【问题描述】:

我们正在使用 cassandra 来存储聊天数据。我们必须维护所有用户的对话并根据收到的消息对其进行排序。

对话:是 2 个或更多用户之间的消息流。对话没有结束时间并且是连续的。

我们正在维护一个基于对话创建时间具有“用户到对话”的表格。但我们想根据收到的消息对其进行排序。

解决方案

  • 解决方案-1:

我看过一个类似的问题Cassandra: List 10 most recently modified records

建议使用物化视图。这种方法适用于频繁更新的记录(如消息)吗?

  • 解决方案-2: 使用另一个表来维护列表中的 user_recentconversations。使用用户接收/发送消息的时间更新列表。

考虑到用例,请提出更好的解决方案。

【问题讨论】:

  • 您想“全局”按时间顺序对它们进行排序吗?还是您想按对话对它们进行排序?
  • 我们想对所有用户的对话进行排序。不需要全局排序。与 whatsapp 对话类似,一旦对话中有新消息,最新的对话就会出现在顶部。
  • 在我的回答和您的评论之后,我认为您的问题并不清楚。此外,您使用的是 Cassandra-2.1,但您提出的解决方案 1 建议使用物化视图,这些视图仅在 Cassandra 3.0 上可用。

标签: cassandra data-modeling cassandra-2.1


【解决方案1】:

您真正想要的是对所有消息进行全局排序。实际上,按最新消息对对话进行排序意味着也对所有消息进行排序。

解决您的问题的一种简单方法是创建另一个表,您可以在其中存储每条到达的消息,以便对对话进行排序:

CREATE TABLE conversations_by_most_recent_message (
    conversation_id int,
    ts timestamp,
    message text,
    PRIMARY KEY (conversation_id, ts)
) WITH CLUSTERING ORDER BY (ts DESC);

每当有消息到达时,您就将其存储在那里。在此表中,您将按时间倒序排列与每个对话有关的所有消息。从此表中获取数据将帮助您了解每次对话的最后一条消息的时间戳。

您需要做的第二步是从每个分区获取最新记录,这可以利用 Cassandra 3.6 中引入的PER PARTITION LIMIT 子句轻松解决:

SELECT * FROM conversations_by_most_recent_message PER PARTITION LIMIT 1;

这将仅从每个分区中获取第一条记录,即仅从每个对话中获取的最新消息。

最后一步是对在应用程序级别检索到的行进行排序(按时间戳降序)。

【讨论】:

  • 因为我们需要检索每个用户基本的对话。这将不起作用,因为它将检索所有用户的所有不同分区。我们也在使用 cassandra 2.1。
猜你喜欢
  • 2015-11-07
  • 2012-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-17
  • 1970-01-01
  • 1970-01-01
  • 2019-01-24
相关资源
最近更新 更多