Cassandra:列出用户最近的对话

标签 cassandra data-modeling cassandra-2.1

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

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

我们正在维护一个表,其中包含基于对话创建时间的“用户对话”。但我们希望根据收到的消息对其进行排序。

解决方案

  • 解决方案-1:

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

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

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

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

最佳答案

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

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

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:列出用户最近的对话,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41519349/

相关文章:

asynchronous - Cassandra 异步写入

php - 建模人员/公司角色

java - 将项目添加到 ArrayList 并分隔

amazon-web-services - 如何从多节点 cassandra 集群重新启动一个事件节点?

docker - Cassandra 2.1.11无法在Docker容器中启动

cassandra - JanusGraph + Cassandra(一般问题)

cassandra - 如何在 WHERE 子句中使用带有 IN 运算符的值列表?

cassandra - 在 cassandra 中使用 Order by 子句

cassandra - 在 cassandra 中为 IOT 进行数据建模

python - 为什么我的 python 字典变得无序?