gpt4 book ai didi

redis - python redis setnx lock功能在django orm中创建唯一记录

转载 作者:IT王子 更新时间:2023-10-29 06:02:32 29 4
gpt4 key购买 nike

我正在使用 Redis 锁来保护重复项目的创建。 (我知道我可以通过许多其他方式做到这一点,但它是我遇到的更复杂问题的一个更简单的测试用例,我想了解为什么 redis/python-redis 失败了)

def redisTester():
for i in range(300):
for j in range(300):
lockKey = "foo_%d_%d" % (i,j)
lock = redis.Redis().lock(lockKey, timeout=60, sleep=1)

lock.acquire()
try:
bf = Foo.objects.get(a=i, b=j)
except Foo.DoesNotExist:
bf = Foo(a=i, b=j)
bf.save()

lock.release()

用这个模型:

class Foo(models.Model):
a = models.IntegerField(db_index=True)
b = models.IntegerField(db_index=True)

我在命令行中启动了这个脚本的两个实例。不知何故,一些记录是重复的:

SELECT COUNT(*) , a, b FROM `redistest_foo` GROUP BY `a`, `b` HAVING COUNT(*) > 1;
+----------+-----+-----+
| COUNT(*) | a | b |
+----------+-----+-----+
| 2 | 2 | 184 |
| 2 | 5 | 92 |
| 2 | 8 | 3 |
| 2 | 10 | 219 |
| 2 | 13 | 127 |
| 2 | 16 | 7 |
| 2 | 18 | 196 |
| 2 | 21 | 85 |
| 2 | 23 | 288 |
...

这可能意味着锁没有正常工作,或者orm的保存没有阻塞。

我错过了什么?这与 django orm 的工作方式有关吗?

最佳答案

原来是和mysql事务管理有关。

innodb默认的事务隔离级别“repeatable read”,所以save不会立即被其他人看到。应该将级别设置为“已提交阅读”

Python's MySqlDB not getting updated row

关于redis - python redis setnx lock功能在django orm中创建唯一记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20660719/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com