【问题标题】:How to set auto increament ID(integer) in cassandra like SQL?如何在 cassandra 中像 SQL 一样设置自动增量 ID(整数)?
【发布时间】:2016-06-23 09:11:54
【问题描述】:

我有数百万条记录,现在我必须获取最新的记录。我想用record_id保存每条记录,并且我希望这个rec​​ord_id在插入新记录时自动增加。

例如:假设我有 1000 条记录,首先我想要从 901 到 1000 的最新 100 条记录。现在在第二个请求中,我想要从 801 到 900 的下 100 条最新记录。我已经浏览了很多链接,但是没有找到任何相关的东西。任何机构都可以给出适当的解决方案吗?

假设表 emp 包含:
名称文本,
record_id 整数,
地址文字

假设 name 是主键,record_id 是集群键。但是现在请不要讨论主键概念,因为我的要求是创建 id 作为集群键(我使用的是 cassandra 2.2.3 和 cql 3.3.1)。

【问题讨论】:

    标签: cassandra


    【解决方案1】:

    Cassandra 不支持自动递增 ID。但是您可以使用 time-based UUID 作为集群键来确保记录从最旧到最近的顺序。

    【讨论】:

      【解决方案2】:

      自动增量 ID 在 Cassandra 或任何其他分布式数据库中并不真正起作用。

      为什么?假设您有三个节点。两个节点同时收到对同一张表的写请求。一个检查表的最大 ID,并获得 2544 的(示例)响应。在写入新行之前,另一个节点执行相同的过程,也得到 2544。现在您有两行插入 2545,而在 Cassandra 中,最后一次写入“获胜”,因此您将输掉第一次写入。

      因此,这也是为什么在 Cassandra 中将先读后写方法视为反模式的原因。正如 Stefan 建议的那样,TimeUUID 提供了解决此问题的方法。

      在 Cassandra 中,您需要设计表以适应您的查询模式。我听到的是,您想要检索最近更新的 100 名员工。我会创建一个特定的表来提供服务:

      CREATE TABLE employee_updates (
        datebucket text,
        record_id timeuuid,
        name text,
        address text,
        PRIMARY KEY (datebucket,record_id))
      WITH CLUSTERING ORDER BY (record_id DESC);
      

      现在当您查询此表的最后 100 条记录时:

      SELECT * FROM employee_udpates WHERE datebucket='20160309' LIMIT 100;
      

      您可以获得当天最近的 100 条记录。

      注意:如果“天”对于您的解决方案来说过于细化(每天只有少数员工记录会更新),那么请随意将其扩大到更适用的范围。

      更新:

      如果我想上一个最新的 100 条记录,即 801 到 900 怎么办

      这个解决方案实际上确实有办法“分页”浏览结果。

      让我们在表格中插入一些行:

      > INSERT INTO employee_updates (datebucket, record_id , address , name ) VALUES ('20160309',now(),'123 main st.','Bob Kerman');
      > INSERT INTO employee_updates (datebucket, record_id , address , name ) VALUES ('20160309',now(),'456 Gene ave.','Bill Kerman');
      > INSERT INTO employee_updates (datebucket, record_id , address , name ) VALUES ('20160309',now(),'34534 Water st.','Jebediah Kerman');
      > INSERT INTO employee_updates (datebucket, record_id , address , name ) VALUES ('20160309',now(),'843 Rocket dr.','Valentina Kerman');
      > INSERT INTO employee_updates (datebucket, record_id , address , name ) VALUES ('20160309',now(),'33476 Booster way','Isabella Kerman');
      > INSERT INTO employee_updates (datebucket, record_id , address , name ) VALUES ('20160309',now(),'43 Solid Rocket pl.','Helcine Kerman');
      

      现在让我选择今天最近的前 3 个:

      > SELECT datebucket, record_id, dateof(record_id), name 
        FROm employee_updates WHERE datebucket='20160309' LIMIT 3;
      
       datebucket | record_id                            | system.dateof(record_id) | name
      ------------+--------------------------------------+--------------------------+------------------
         20160309 | 511f9150-e5db-11e5-a4ba-a52893cc9f36 | 2016-03-09 09:43:02+0000 |   Helcine Kerman
         20160309 | 2f9f3670-e5db-11e5-a4ba-a52893cc9f36 | 2016-03-09 09:42:06+0000 |  Isabella Kerman
         20160309 | 23b0dc60-e5db-11e5-a4ba-a52893cc9f36 | 2016-03-09 09:41:46+0000 | Valentina Kerman
      
      (3 rows)
      

      由于我已按 DESCending 顺序将该表聚集在 record_id 上,因此只需查询比我读到的最后一条记录少的 record_id 即可获得接下来的 3 条记录。在这种情况下,那就是23b0dc60-e5db-11e5-a4ba-a52893cc9f36

      > SELECT datebucket, record_id, dateof(record_id), name 
        FROm employee_updates WHERE datebucket='20160309' 
        AND record_id < 23b0dc60-e5db-11e5-a4ba-a52893cc9f36 LIMIT 3;
      
       datebucket | record_id                            | system.dateof(record_id) | name
      ------------+--------------------------------------+--------------------------+-----------------
         20160309 | 16400100-e5db-11e5-a4ba-a52893cc9f36 | 2016-03-09 09:41:23+0000 | Jebediah Kerman
         20160309 | 0b239cf0-e5db-11e5-a4ba-a52893cc9f36 | 2016-03-09 09:41:05+0000 |     Bill Kerman
         20160309 | 00d648b0-e5db-11e5-a4ba-a52893cc9f36 | 2016-03-09 09:40:47+0000 |      Bob Kerman
      
      (3 rows)
      

      【讨论】:

      • 谢谢@Aaron,我明白了,如果我想要以前的最新 100 条记录怎么办。 (就像我有 1000 条记录现在我得到了最新的 100 条记录,正如你所说的那样,即 901 到 1000,如果我想要以前最新的 100 条记录,即 801 到 900 怎么办),我想要为每个请求分页 100 条记录,任何人都可以请根据我的要求建议查询...
      猜你喜欢
      • 2017-04-05
      • 2014-11-18
      • 1970-01-01
      • 2020-01-29
      • 1970-01-01
      • 2011-12-26
      • 2015-12-22
      • 1970-01-01
      • 2019-11-28
      相关资源
      最近更新 更多