[zeromicro/go-zero]redis锁重入bug

2024-01-12 373 views
5

redis锁重入bug,可重入锁往往会有多次释放锁,第一次释放锁就会把锁释放

  1. Acquire
    Acquire
    Release // 这行会吧rediskey删除,导致其他人可以抢占到锁
    在这里的代码将没有锁保护
    Release
    

回答

9

你建议怎么修复呢?

6

多个进程或协程调用多次锁,应该传入标识ID,我觉得可以支持参数传入,释放时以对应参数释放呢?在同一个key上,那必然引起此问题

7

redis lua部分不需要支持重入锁,只需要在RedisLock结构体里定义一个当前重入次数的变量,然后请求锁时只增加这个变量的值,每次释放锁减少这个变量的值,当减少到0时删除redis key

6

我不认为应该支持重入,可以像go的mutex那样禁止重入。

9

之前原来的代码在lua部分不是支持重入的吗?如果不支持重入这个lua就改成返回false if redis.call("GET", KEYS[1]) == ARGV[1] then redis.call("SET", KEYS[1], ARGV[1], "PX", ARGV[2]) return "OK"

2

这里还有个锁超时要考虑

0

merged.

我觉得考虑合理,感谢!