nodeJS中的并发安全短唯一整数ID生成

我有一个节点应用程序,我正在使用rethinkdb作为数据库。 id rethinkdb为每个文档生成的不是人类可读的,不适合现实世界的参考目的。

例如,我创build的每个用户都希望具有一个简短的整数ID,我可以用它来在现实世界中引用该用户。 我从数据库中得到的id不适合。

什么是并发安全的方式来生成一个短的唯一的整数ID?

根据@Suvitruf的回答,你可以使用下面的方法在纯reql中完成这个工作:“last”是一个包含最后一个id的表。 这里所做的修改专门用于并行更新。 代替每个更新的单独的id更新,数字块被保留在作为查询的一部分的1个插入中。 请给他答复的任何分数。

r([{ foo: 'a' }, { foo: 'b'}]) .do(records => { return r.table('lastId').get('last')('current') .do(current => { return r.table('lastId').get('last').update({ current: current.add(records.count()) }) .do(() => { return r.range(0, records.count()).map(idx => { return records.nth(idx).merge(rec => { return { id: current.add(idx) } }) }) }) }) }) .coerceTo('array') .do(records => { return r.table('ids').insert(records) }) 

您可以创build新表,例如System。

添加到这个表只有一个logging:

 { id: "myLastId", current: 0 } 

当你想插入新的logging到另一个表,你需要首先增加这个ID并返回:

 const getNewId = r.table("System").get("myLastId").update({ current: r.row("current").add(1) }, {returnChanges: true}); 

您的新ID将在result.changes[0]["new_val"].current 。 现在,你可以用这个ID插入新的logging。

是的,每次要插入新logging时都必须发送额外的请求,但至less该方法是100%primefaces化的,并且在群集中的所有节点之间同步。

Interesting Posts