释放锁的时候 get then delete 不是一个原子操作,可能存在竞态问题。在多线程环境中,如果两个线程几乎同时检查锁的值,并且它们都发现锁的值与自己的 UUID 匹配,那么它们都会尝试删除锁,从而可能导致其中一个线程误删另一个线程的锁。所以一般采用 lua 脚本:
```lua
local key = KEYS[1]
local value = ARGV[1]
if redis.call("GET", key) == value then
return redis.call("DEL", key)
else
return 0
end
```
```lua
local key = KEYS[1]
local value = ARGV[1]
if redis.call("GET", key) == value then
return redis.call("DEL", key)
else
return 0
end
```
2025-01-03