我正在寻找一种为nosql数据库生成唯一ID的方法。与关系数据库不同,不知道行,这意味着没有最后一行要递增。
处理此问题的最常用方法是使用 UUID 。但我的问题是我需要添加另一个ID(除了UUID ),这需要是:
总数据可能会达到50,000,000
左右。那么如何生成有点 唯一 uint32 ID?
UInt32值类型表示无符号整数,其值范围为0到4,294,967,295。
答案 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);
});
});
});
}