使用javascript和redis生成唯一的随机id

lx0bsm1f  于 2021-06-09  发布在  Redis
关注(0)|答案(1)|浏览(434)

我想为每个用户生成一个随机id,并使用node.js将其保存在redis集中。我的第一种方法是生成一个随机id,然后使用redis sismember检查它的唯一性,如果它不是唯一的,则使用循环重复上面的任务。问题是节点redis是异步的,所以我不能实现上面描述的循环。我还考虑过使用如下承诺:

  1. var promises = [], f=1;
  2. while(f){
  3. suggested_id = new_random_id();
  4. promises.push(new Promise(function(resolve,reject) {
  5. red_client.sismember("uids", suggested_id, function(err, value) {
  6. if(err) {reject(err); }
  7. resolve(value);
  8. });
  9. setTimeout(resolve, 1000, 'foo');
  10. }));
  11. Promise.all(promises).then((values)=>{
  12. f = values[0];
  13. });
  14. }
  15. }

但是同样的,promises.all是另一个异步函数,因此循环开始对redis进行无数次调用,而不必等待前一个函数的响应。有人知道怎么做吗?

ybzsozfc

ybzsozfc1#

你为什么不等待承诺完成并取得成功,然后开始你的工作呢

  1. const getUniqueId = new Promise( (resolve, reject) => {
  2. const generateId = async () => {
  3. suggested_id = new_random_id();
  4. red_client.sismember("uids", suggested_id, function(err, value) {
  5. if(err) {
  6. // call generateId again, this is the retry
  7. generateId ()
  8. return
  9. }
  10. resolve(suggested_id);
  11. });
  12. })
  13. generateId()
  14. })
  15. const uniqueId = await getUniqueId()

注意:考虑到事实上,你检查的身份证,稍后你会使用它你的风险失去了身份证在同一时间。

展开查看全部

相关问题