如何在Cassandra中创建自动增量ID

And*_*Wan 46 cassandra

我们知道在SQL数据库中创建自动增量ID很容易,在Cassandra中有一个很好的解决方案吗?ID应该是键名或列名.

小智 35

在分布式系统中创建全局顺序数字序列并没有任何意义.使用UUID.

(因为你必须让所有参与者同意并接受序列的演变 - 在一个天真的实现下)

  • Cassandra支持计数器(https://cassandra.apache.org/doc/cql3/CQL.html#counters),但有一些限制. (3认同)

Alo*_*onL 33

使用Cassandra的轻量级交易,以下情况如何?

1 - 创建ID表:

CREATE TABLE ids (
  id_name varchar,
  next_id int,
  PRIMARY KEY (id_name)
)
Run Code Online (Sandbox Code Playgroud)

2 - 插入您想要使用全局序列的每个id

例如:

INSERT INTO ids (id_name, next_id)
VALUES ('person_id', 1)
Run Code Online (Sandbox Code Playgroud)

3 - 然后,当您插入要使用自动递增密钥的表时,请执行以下操作:

3.1 - 从ids表中获取next_id:

SELECT next_id FROM ids WHERE id_name = 'person_id'
Run Code Online (Sandbox Code Playgroud)

假设结果是next_id = 1

3.2 - 增加next_id,方法如下:

UPDATE ids SET next_id = 2 WHERE id_name = 'person_id' IF next_id = 1
Run Code Online (Sandbox Code Playgroud)

结果应如下所示:

[{[applied]: True}]
Run Code Online (Sandbox Code Playgroud)

如果它已成功更新,或者

[{[applied]: False, next_id: 2}]
Run Code Online (Sandbox Code Playgroud)

如果其他人已经更新了它.

所以,如果你得到True,请使用id'1' - 它是你的.否则,递增next_id(或只使用返回的next_id)并重复该过程.

  • 这种模式称为“乐观锁定” (3认同)

Sim*_*mon 15

没有好的解决方案.

  1. 创建一个带有数字的列,增加数量并将其与临时ID一起保存到所有副本,读取所有副本并检查临时ID是否为"你的",如果不再这样做...不是一个很好的解决方案而且不会规模.

要么

  1. 在您获取下一个ID时构建自己的ID服务.此服务仅在单个实例中运行,并且将是非缩放可怕因素.

只要有任何事情超出单个实例,id的排序就会变得复杂,至少如果你想扩展它.这包括关系数据库.


小智 5

有一个可以使用的计数器数据类型.考虑下面的例子.

CREATE KEYSPACE counterks WITH REPLICATION =
{ 'class' : 'NetworkTopologyStrategy', 'datacenter1' : 3 };
Run Code Online (Sandbox Code Playgroud)

为计数器列创建一个表.

CREATE TABLE counterks.page_view_counts
(counter_value counter,
url_name varchar,
page_name varchar,
PRIMARY KEY (url_name, page_name)
);
Run Code Online (Sandbox Code Playgroud)

将数据加载到计数器列中.

UPDATE counterks.page_view_counts
SET counter_value = counter_value + 1
WHERE url_name='www.datastax.com' AND page_name='home';
Run Code Online (Sandbox Code Playgroud)

看一下计数器值.

SELECT * FROM counterks.page_view_counts;
Run Code Online (Sandbox Code Playgroud)

输出是:

 url_name         | page_name | counter_value
------------------+-----------+---------------
 www.datastax.com |      home |             1
Run Code Online (Sandbox Code Playgroud)

增加柜台的价值.

 UPDATE counterks.page_view_counts
 SET counter_value = counter_value + 2
 WHERE url_name='www.datastax.com' AND page_name='home';
Run Code Online (Sandbox Code Playgroud)

看一下计数器值.

 url_name         | page_name | counter_value
------------------+-----------+---------------
www.datastax.com |      home |             3  
Run Code Online (Sandbox Code Playgroud)

有关更多详细信息,请参阅此处:http://docs.datastax.com/en/cql/3.1/cql/cql_using/use_counter_t.html

  • 不幸的是,计数器似乎没有“获取和增量”选项[?],因此它受到竞争条件的影响,请参阅对 AlonL 答案的评论。 (2认同)