我们使用 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/