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