这不是关于在 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 可以扩展它.
应用程序.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 中的计数器不会也锁定行吗?应用程序的规模有多大?