Django:在竞争条件下使用UUID4重复唯一ID

时间:2015-04-17 07:35:15

标签: python mysql django uuid

我正在使用uuid.uuid4().hex生成随机唯一键,我想将其用作key来重置密码。

有一个场景,多个用户尝试请求更改密码,因为IntegrityError正在复制,我正在考虑key

我非常不情愿地知道uuid.uuid4().hex生成一个重复的密钥,但在这个场景中,对请求的竞争条件,它们的关键是重复。

我已经想到了几种方法,但我想知道哪种方式更好。

尝试/除外

saved = false
while not saved:
    key = uuid.uuid4().hex
    try:
        reset_password_object.key = key
        reset_password_object.save()
        saved = True
    except IntegrityError:
       key = uuid.uuid4().hex    

过滤模型

found = True

while found:
    key  = uuid.uuid4().hex
    found = ResetPassword.objects.filter(key=key).count()

然后使用此键添加新条目。

其他可能性有哪些? 感谢。

1 个答案:

答案 0 :(得分:0)

如果我在你的位置,我会在使用它之前重新生成一些10K或20K的键。将它们存储在redis中。

  1. 创建大约10K或20K的唯一UUID
  2. 每次需要时,将它们存储在redis密钥和LPOP中。
  3. 当您再次使用所有10K或20K UUID重新生成时,通过cron或某种机制。
  4. 这样您的程序将得到优化。