使用 javascript 和 redis 生成唯一的随机 ID
generating unique random id using javascript and redis
我想为每个用户生成一个随机 ID,并使用 node.js 将其保存在 redis 集中。我的第一种方法是生成一个随机 id,然后使用 redis SISMEMBER 检查它的唯一性,如果它不是唯一的,则使用循环重复上述任务。问题是node redis是异步的,所以,我无法实现上面描述的循环。我还考虑过使用如下承诺:
var promises = [], f=1;
while(f){
suggested_id = new_random_id();
promises.push(new Promise(function(resolve,reject) {
red_client.sismember("uids", suggested_id, function(err, value) {
if(err) {reject(err); }
resolve(value);
});
setTimeout(resolve, 1000, 'foo');
}));
Promise.all(promises).then((values)=>{
f = values[0];
});
}
}
但是 Promises.all 又是另一个异步函数,所以循环开始
无数次调用redis而不等待前一个响应。有谁知道如何做到这一点?
你为什么不等待承诺成功完成然后运行你的工作
const getUniqueId = new Promise( (resolve, reject) => {
const generateId = async () => {
suggested_id = new_random_id();
red_client.sismember("uids", suggested_id, function(err, value) {
if(err) {
// call generateId again, this is the retry
generateId ()
return
}
resolve(suggested_id);
});
})
generateId()
})
const uniqueId = await getUniqueId()
注意:考虑到您检查 ID 并稍后使用它的事实,您同时冒着丢失 ID 的风险。
我想为每个用户生成一个随机 ID,并使用 node.js 将其保存在 redis 集中。我的第一种方法是生成一个随机 id,然后使用 redis SISMEMBER 检查它的唯一性,如果它不是唯一的,则使用循环重复上述任务。问题是node redis是异步的,所以,我无法实现上面描述的循环。我还考虑过使用如下承诺:
var promises = [], f=1;
while(f){
suggested_id = new_random_id();
promises.push(new Promise(function(resolve,reject) {
red_client.sismember("uids", suggested_id, function(err, value) {
if(err) {reject(err); }
resolve(value);
});
setTimeout(resolve, 1000, 'foo');
}));
Promise.all(promises).then((values)=>{
f = values[0];
});
}
}
但是 Promises.all 又是另一个异步函数,所以循环开始 无数次调用redis而不等待前一个响应。有谁知道如何做到这一点?
你为什么不等待承诺成功完成然后运行你的工作
const getUniqueId = new Promise( (resolve, reject) => {
const generateId = async () => {
suggested_id = new_random_id();
red_client.sismember("uids", suggested_id, function(err, value) {
if(err) {
// call generateId again, this is the retry
generateId ()
return
}
resolve(suggested_id);
});
})
generateId()
})
const uniqueId = await getUniqueId()
注意:考虑到您检查 ID 并稍后使用它的事实,您同时冒着丢失 ID 的风险。