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

Concurrent safe short unique integer id generation in nodeJS

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

例如,我创建的每个用户都希望有一个短整数 ID,我可以用它来引用现实世界中的该用户。我从数据库中获取的 ID 不适合那个。

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

您可以创建新的 table,例如 System.

添加到此 table 一条记录:

{
    id: "myLastId",
    current: 0
}

当你想向另一个table插入新记录时,你需要先增加这个id然后return它:

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

您的新 ID 将在 result.changes[0]["new_val"].current。现在,您可以使用此 ID 插入新记录。

是的,每次要插入新记录时都必须发送额外的请求,但至少,此方法是 100% 原子的,并且在集群中的所有节点之间同步。

根据@Suvitruf 的回答,您可以使用以下命令在纯 reql 中完成此操作,其中 "last" 是包含最后一个 ID 的 table。此处所做的修改专门用于并行更新。代替每次更新的单独 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)    
})