ホームページ  >  に質問  >  本文

PHPRedisを使用したロック機構の実装

<p>Redis キーをロックするための次の 2 つの関数を取得しました。 Redis を使用してコード ブロックの同時実行を防止しようとしています。そこで私がやったのは、次の関数を使用して、異なるスレッドが同じコードを実行しないようにすることでした。 </p> <pre class="brush:php;toolbar:false;">lockRedisKey("ABC"); 同時に実行したくないコードです。 unlockRedisKey("ABC");</pre> <p>残念ながら、これは機能しないようで、 exit_time に達するまで lockRedisKey() が無限ループします。何が問題になる可能性がありますか? </p> <pre class="brush:php;toolbar:false;">static public function lockRedisKey($key, $value = "true") { $redis = RedisClient::getInstance(); $time = マイクロタイム(true); $exit_time = $time 10; $sleep = 10000; する { // PX および NX で Redis をロックする $lock = $redis->setnx("lock:" . $key, $value); if ($lock == 1) { $redis->expire("lock:" . $key, "10"); true を返します。 } usleep($sleep); while (microtime(true) < $exit_time); false を返します。 } 静的パブリック関数unlockRedisKey($key) { $redis = RedisClient::getInstance(); $redis->del("lock:" . $key); }</pre> <p>デッドロックに直面する可能性があることがわかっていたので、トランザクションを使用することにしましたが、依然としてこの問題に直面しています。 </p> <pre class="brush:php;toolbar:false;">static public function lockRedisKey($key, $value = "true") { $redis = RedisClient::getInstance(); $time = マイクロタイム(true); $exit_time = $time 10; $sleep = 10000; する { // PX および NX で Redis をロックする $redis->multi(); $redis->set('lock:' . $key, $value, array('nx', 'ex' => 10)); $ret = $redis->exec(); if ($ret[0] == true) { true を返します。 } usleep($sleep); while (microtime(true) < $exit_time); false を返します。 } 静的パブリック関数unlockRedisKey($key) { $redis = RedisClient::getInstance(); $redis->multi(); $redis->del("lock:" . $key); $redis->exec(); }</pre></p>
P粉515066518P粉515066518442日前622

全員に返信(2)返信します

  • P粉386318086

    P粉3863180862023-08-29 12:37:10

    「exit_time」が小さすぎます。 $exit_time = $time 10; は 10 秒後に閉じることを意味すると思います。 ただし、設定時間はマイクロタイムです。

    「$exit_time = $time 10;」を「$exit_time = $time 100000;」に置き換えることができるかもしれません。 Google 翻訳によって書かれました

    返事
    0
  • P粉336536706

    P粉3365367062023-08-29 11:16:33

    ロックは正常に機能します。これはロック間のコードをクラッシュさせるだけで、ロックが解放されなくなります :-)

    返事
    0
  • キャンセル返事