首页 文章

在Cassandra上使用计数器处理自动增量ID的方法?

提问于
浏览
1

这不是关于在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;

相比之下,如果上面的语句有效,它可能会锁定行,但增加并 grab 应用程序本身的索引,然后安全地增加Cassandra中的计数器也不会锁定行?应用程序的规模如何?

1 回答

  • 0

    如果您需要短增量ID生成,请查看Snowflake或其他无数克隆/灵感 .

    你试图做的是一个关于多重问题的坏主意 .

相关问题