使用PHPRedis實現鎖定機制
P粉515066518
P粉515066518 2023-08-28 18:33:09
0
2
638
<p>我得到了以下兩個用於鎖定 Redis 金鑰的函數。我試圖防止使用 Redis 並發執行程式碼區塊。所以我所做的就是使用以下函數,以防止不同線程執行相同的程式碼。 </p> <pre class="brush:php;toolbar:false;">lockRedisKey("ABC"); CODE THAT I DON'T WANT TO RUN CONCURRENTLY! unlockRedisKey("ABC");</pre> <p>不幸的是,它似乎不起作用,並導致 lockRedisKey() 無限循環,直到達到 exit_time。可能出了什麼問題? </p> <pre class="brush:php;toolbar:false;">static public function lockRedisKey($key, $value = "true") { $redis = RedisClient::getInstance(); $time = microtime(true); $exit_time = $time 10; $sleep = 10000; do { // Lock Redis with PX and NX $lock = $redis->setnx("lock:" . $key, $value); if ($lock == 1) { $redis->expire("lock:" . $key, "10"); return true; } usleep($sleep); } while (microtime(true) < $exit_time); return false; } static public function 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 = microtime(true); $exit_time = $time 10; $sleep = 10000; do { // Lock Redis with PX and NX $redis->multi(); $redis->set('lock:' . $key, $value, array('nx', 'ex' => 10)); $ret = $redis->exec(); if ($ret[0] == true) { return true; } usleep($sleep); } while (microtime(true) < $exit_time); return false; } static public function unlockRedisKey($key) { $redis = RedisClient::getInstance(); $redis->multi(); $redis->del("lock:" . $key); $redis->exec(); }</pre></p>
P粉515066518
P粉515066518

全部回覆(2)
P粉386318086

您的「exit_time」太小。 我認為'$exit_time = $time 10;'的含義10秒後將其關閉。 不過,設定的時間是微時間。

也許你可以替換 '$exit_time = $time 10;'與“$exit_time = $time 100000;”。 由Google翻譯撰寫

P粉336536706

鎖定工作正常。這只是鎖定之間的程式碼崩潰並導致鎖定無法釋放:-)

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板