Database Cassandra-桶方法上的令牌分页

Database Cassandra-桶方法上的令牌分页,database,cassandra,pagination,cql,cassandra-3.0,Database,Cassandra,Pagination,Cql,Cassandra 3.0,我目前正在进行聊天,我想对给定线程的消息进行分页。我是一张卡桑德拉桌子,看起来像这样: CREATE TABLE messages ( ID uuid, ... CreatedAt timestamp, ... ThreadID varchar, Bucket int, ..., PRIMARY KEY ((ThreadID, Bucket, SentAt), ID) ) WITH CLUSTERING ORDER BY (ID DESC); 这种方法是按照Th

我目前正在进行聊天,我想对给定线程的消息进行分页。我是一张卡桑德拉桌子,看起来像这样:

CREATE TABLE messages (
  ID uuid,
  ...
  CreatedAt timestamp,
  ...
  ThreadID varchar,
  Bucket int,
  ...,
  PRIMARY KEY ((ThreadID, Bucket, SentAt), ID)
) WITH CLUSTERING ORDER BY (ID DESC);
这种方法是按照ThreadID和Bucket(因此每个分区最多可以获得100k条消息)以及SentAt date(分页)对消息进行分区。我还在主键中使用ID,以便在插入时对邮件进行排序。如果我错了,请纠正我

我从以下两个链接获得了这种方法:

  • 不和谐博客:
  • 因此,问题:
(免责声明:以下代码仅供阅读,尚未真正开发)

如果我使用
选择令牌(ThreadID、Bucket、SentAt)进行查询,。。。来自消息,其中令牌(ThreadID、Bucket、SentAt),最终的行为是什么

  • 如果我使用UUID而不是BigInt作为ID类型,它会工作吗
  • 按ID排序消息实际上会加快阅读速度吗
  • 根据一些规则,Bucket值可能会增加1。使用
    的令牌方法会首先比较日期(降序),然后比较桶吗
谢谢你的澄清

编辑一个示例以使其更清晰 这是我的桌子(当然是抽象的)。每X条消息,BucketID就会增加一次(比如每10万条新消息)。我最近返回的消息是消息xxxA。从这里,我想多编10条信息。使用bucket ID将有助于我只在表的分区上分页(现在是分区3)。但是,如果我无法获取消息,我需要在查询时减少BucketID并重试

那么,我的WHERE子句是否需要双令牌方法?因为我首先需要标记(ThreadID,BucketID)为(A,3),但同时,我希望在给定标记(ThreadID,SentAt)之前(早于)获得前10个结果(A,2020-01-07 18:30:49+0000)

谢谢

id   | threadid | bucketid | sentat
-----+----------+----------+---------------------------------
xxxx |    A     |    1     | 2020-01-06 21:00:23 +0000
xxxx |    A     |    1     | 2020-01-06 21:22:21 +0000
xxxx |    A     |    1     | 2020-01-06 23:00:00 +0000
.... | .......  | ........ | .........................
xxxx |    A     |    2     | 2020-01-07 01:23:50 +0000
.... | .......  | ........ | .........................
.... | .......  | ........ | .........................
xxxA |    A     |    3     | 2020-01-07 18:30:49 +0000
xxxB |    A     |    3     | 2020-01-07 18:30:55 +0000
.... | .......  | ........ | .........................