釋放鎖的時候 get then delete 不是一個原子操作,可能存在競態(tài)問題。在多線程環(huán)境中,如果兩個線程幾乎同時檢查鎖的值,并且它們都發(fā)現(xiàn)鎖的值與自己的 UUID 匹配,那么它們都會嘗試刪除鎖,從而可能導(dǎo)致其中一個線程誤刪另一個線程的鎖。所以一般采用 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