保证 Cassandra 中排序数据的唯一性

问题描述 投票:0回答:1

我是 Cassandra 的新手,我在尝试弄清楚如何订购数据时遇到了困难。我正在尝试为每个主播录制来自 twitch.tv 的消息。我想要类似下面的东西

CREATE TABLE IF NOT EXISTS chat_data.twitch_chat_by_broadcaster_and_timestamp (
    broadcaster_id int,
    timestamp int,
    message text,
    PRIMARY KEY (broadcaster_id, timestamp)
) WITH CLUSTERING ORDER BY (timestamp DESC);

虽然对于业余爱好项目来说这不是问题,但如何解决同时发送两条消息的问题。我知道

TimeUUID
,但我希望消息按发送时的时间戳排序,而且除了
TimeUUID
之外,似乎没有任何官方方法可以创建
now()

我设想使用此数据库来获取给定流的给定时间范围内的所有消息。我意识到我可以添加另一个

UUID
字段来保证唯一性,但这会搞砸我的查询,因为我必须指定准确的时间。

对这些数据进行排序以实现高效查询的正确方法是什么?

cassandra
1个回答
0
投票

我意识到我可以添加另一个 UUID 字段来保证唯一性,但这会搞砸我的查询,因为我必须指定准确的时间。

如果您将其添加为最后一个聚类列,则不会:

CREATE TABLE IF NOT EXISTS chat_data.twitch_chat_by_broadcaster_and_timestamp (
    broadcaster_id int,
    timestamp int,
    message_id uuid,
    message text,
    PRIMARY KEY (broadcaster_id, timestamp, message_id)
) WITH CLUSTERING ORDER BY (timestamp DESC, message_id ASC);

这样,您可以在写入时简单地生成一个新的 UUID。只要通过

broadcaster_id
的分区键查询,数据仍然会按(两者)
timestamp
排序,并添加
message_id
以确保唯一性。

据我所知,

broadcaster_id
对消息的查询没有改变:

> SELECT * FROM twitch_chat_by_broadcaster_and_timestamp WHERE broadcaster_id=68;

 broadcaster_id | timestamp     | message_id                           | message
----------------+---------------+--------------------------------------+---------------------------
             68 | 1705328231991 | ac74c7ba-1813-4b75-b873-8817c6f89a55 |            End of stream.
             68 | 1705328230499 | 0e2116d5-887c-4433-b9cc-e5c13534902d |  Next stream coming soon.
             68 | 1705327984482 | 01c52a3a-c1c3-4db4-b8a8-6f9fe3111911 |        Incoming messages!
             68 | 1705327983581 | 7a3c2444-5746-4928-9e6a-0ebaac7fbec5 | Next stream starting soon
© www.soinside.com 2019 - 2024. All rights reserved.