0

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

このモデルには競合状態があると思います:

  1. クライアント A は 3 秒の有効期限でロックを取得します。SET key randomstring1 NX PX 3000
  2. スリープ 2.99 秒。
  3. クライアント A はロックを解除し、上記のコードを呼び出します。
  4. 条件は真です。if redis.call("get",KEYS[1]) == ARGV[1] then
  5. 元のキーの有効期限が切れています
  6. クライアント B は、anthor ロックを取得します。SET key randomstring2 NX PX 3000
  7. クライアント A がキーを削除します。
  8. クライアント B のロックがクライアント A によって削除されました。
4

1 に答える 1

2

いいえ、競合状態はありません。LUA スクリプトはアトミックに実行されます。これは、他の接続 (クライアント) からのコマンドは、LUA スクリプトが動作を完了する前に処理されないことを意味します (期限切れのアイテムを実際に処理する Redis 内部 cron であっても)。

于 2016-01-19T07:38:46.153 に答える