为Couchbase生成唯一的UInt32 ID

时间:2014-08-10 15:05:28

标签: javascript node.js couchbase

我正在寻找一种为nosql数据库生成唯一ID的方法。与关系数据库不同,不知道行,这意味着没有最后一行要递增。

处理此问题的最常用方法是使用 UUID 。但我的问题是我需要添加另一个ID(除了UUID ),这需要是:

  • 独特
  • 未签名的Int32

总数据可能会达到50,000,000左右。那么如何生成有点 唯一 uint32 ID?

  

UInt32值类型表示无符号整数,其值范围为0到4,294,967,295。

  • 仅在新用户注册时生成。
  • 每个新用户都会获得3个ID。
  • 目前使用 Couchbase服务器

3 个答案:

答案 0 :(得分:3)

这个问题已经解决了 - 我建议在Couchbase中使用原子Increment (or Decrement)函数 - 这些是生成唯一ID的常用模式。

每当调用incr()方法时, atomically 将计数器增加指定值,并返回旧值,因此如果两个客户端尝试增加它是安全的在同一时间。

伪代码示例(我没有Node.JS专家!):

// Once, at the beginning of time we init the counter:
client.set("user::count", 0);
...
// Then, whenever a new user is needed: 
nextID = client.incr("user::count", 1); // increments counter and returns 'old' value.
newKey = "user_" + nextID;
client.add(newKey, value);

请参阅Node.JS SDK以获取参考,有关完整的使用示例,请参阅Couchbase开发人员指南中的Using Reference Doucments for Lookups部分。

答案 1 :(得分:1)

这是一个每次调用时都返回唯一标识符的函数。只要项目数不超过32位整数的范围就应该没问题,这似乎是所描述的要求的情况。 (警告:一旦UID数组填满,就会进入无限循环。您可能还想创建某种可以清空数组的重置函数,从而在必要时重置UID。)

var getUID = (function() {
    var UIDs = [];

    return function() {
        var uid;

        do {
            uid = Math.random() * Math.pow(2, 32) | 0x0;
        } while (UIDs[uid] !== undefined);

        return UIDs[uid] = uid;
    };
}());

答案 2 :(得分:0)

如果您将通过传递“ user”作为键来调用此插入方法,则您的docId将自动递增为 用户_0 用户_1 用户_2 等等... 请注意,couchbase将在您的存储桶中显示一行额外的行,其中键为meta id,下一个计数器值为doc value。如果您使用表中的select count(*)total之类的查询,请不要感到惊讶;因为它将显示比实际计数多的数,以避免使用where子句,这样就不会计算该行。

public insert(data: any, key: string) {
  return new Promise((resolve, reject) => {
    let bucket = CouchbaseConnectionManager.getBucket(`${process.env.COUCHBASE_BUCKET}`)
    bucket.counter(key, 1, {initial:0}, (err:any, res:any)=>{
      if(err){
        this.responseHandler(err, res, reject, resolve);
      }
      const docId = key + "_" + res.value;
      bucket.insert(docId, data, (error:any, result:any) => {
        this.responseHandler(error, result, reject, resolve);
      });
    });
  });
}