这不是关于在Cassandra上使用主键自动增量整数而不是UUID的问题,在这种情况下我想在Cassandra上生成像PostgreSQL这样的自动增量效果,不需要一定是可扩展的。我正在使用UUID作为表中条目的主键,但我需要为这些条目生成一个像bitly一样的shortid。所以我开始尝试创建一个应用程序来抓取特定条目的索引,并根据该索引生成一个shortid,然后将shortid设置为条目。
所以我想在Cassandra上做这样的事情:
CREATE TABLE photo (
id uuid,
shortid text,
title text,
PRIMARY KEY (id)
);
CREATE TABLE shortid (
shortid text,
family text,
longid uuid,
index bigint,
created_at timestamp,
PRIMARY KEY ((shortid, family))
) WITH COMPACT STORAGE;
CREATE TABLE shortid_reverse (
longid uuid,
family text,
shortid text
PRIMARY KEY ((longid, family))
) WITH COMPACT STORAGE;
CREATE TABLE shortid_last_index (
family text,
last_index counter,
last_long_id uuid,
PRIMARY KEY (family)
);
所以在这个将处理shortid的应用程序中,当应用程序启动时它将获得该系列的最后一个索引,然后它将增加应用程序本身的值,因为此应用程序将在Nodejs和Nodejs上运行可以扩大规模。
的application.js
var index = lastIndexFromCassandra++ //5
, hashids = new Hashids("this is my salt")
, shortid = hashids.encrypt(index); //dDae3KDDj4Q
在应用程序增加索引并生成shortid后,它将继续存在于Cassandra:
UPDATE shortid_last_index SET last_index = last_index+1, last_long_id = fabac1f0-7f88-11e3-baa7-0800200c9a66 WHERE family = 'photo';
INSERT INTO shortid (shortid, family, longid, index, created_at) VALUES ('dDae3KDDj4Q', 'photo', fabac1f0-7f88-11e3-baa7-0800200c9a66, 5, NOW());
INSERT INTO shortid_reverse (longid, family, shortid) VALUES (fabac1f0-7f88-11e3-baa7-0800200c9a66, 'photo', 'dDae3KDDj4Q');
UPDATE photo SET shortid = 'dDae3KDDj4Q' WHERE id = fabac1f0-7f88-11e3-baa7-0800200c9a66;
所以,实际上没有更好的方法在Cassandra中这样做而不创建一个只会这样做的应用程序?我不能在Cassandra上做类似PostgreSQL的事情:
UPDATE shortid_last_index SET last_index = last_index+1, last_long_id = ? WHERE family = 'photo' RETURNING last_index;
相比之下,如果上面的语句有效,它可能会锁定行,但是增加并抓住应用程序本身的索引然后安全地增加Cassandra中的计数器也不会锁定行?应用程序的规模如何?
答案 0 :(得分:0)
如果您需要短增量ID生成,请查看Snowflake或其他无数克隆/灵感之一。
你试图做的事情是关于多重计数的坏主意。