http://redis.io/topics/distlockで、Redis を使用した分散ロックに関する投稿を読みました。「ロック解除」を行う方法を説明する lua スクリプトがあります。
if redis.call("get",KEYS[1]) == ARGV[1] then
return redis.call("del",KEYS[1])
else
return 0
end
このモデルには競合状態があると思います:
- クライアント A は 3 秒の有効期限でロックを取得します。
SET key randomstring1 NX PX 3000
- スリープ 2.99 秒。
- クライアント A はロックを解除し、上記のコードを呼び出します。
- 条件は真です。
if redis.call("get",KEYS[1]) == ARGV[1] then
- 元のキーの有効期限が切れています
- クライアント B は、anthor ロックを取得します。
SET key randomstring2 NX PX 3000
- クライアント A がキーを削除します。
- クライアント B のロックがクライアント A によって削除されました。