PHPRedis를 사용하여 잠금 메커니즘 구현
P粉515066518
2023-08-28 18:33:09
<p>Redis 키를 잠그는 데는 다음 두 가지 기능이 있습니다. Redis를 사용하여 코드 블록의 동시 실행을 방지하려고 합니다. 그래서 내가 한 일은 다른 스레드가 동일한 코드를 실행하는 것을 방지하기 위해 다음 함수를 사용하는 것입니다. </p>
<pre class="brush:php;toolbar:false;">lockRedisKey("ABC");
동시에 실행하고 싶지 않은 코드!
UnlockRedisKey("ABC");</pre>
<p>안타깝게도 작동하지 않는 것 같으며 lockRedisKey()가exit_time에 도달할 때까지 무한 반복됩니다. 무엇이 잘못될 수 있나요? </p>
<pre class="brush:php;toolbar:false;">정적 공개 함수 lockRedisKey($key, $value = "true") {
$redis = RedisClient::getInstance();
$time = 마이크로타임(true);
$exit_time = $time + 10;
$수면 = 10000;
하다 {
// PX 및 NX로 Redis를 잠급니다.
$lock = $redis->setnx("잠금:" . $key, $value);
if ($lock == 1) {
$redis->expire("lock:" . $key, "10");
사실을 반환;
}
usleep($sleep);
} while (microtime(true) < $exit_time);
거짓을 반환;
}
정적 공개 함수 UnlockRedisKey($key) {
$redis = RedisClient::getInstance();
$redis->del("잠금:" . $key);
}</pre>
<p>교착상태에 직면할 수 있다는 것을 알고 트랜잭션을 사용하기로 결정했지만 여전히 이 문제에 직면하고 있습니다. </p>
<pre class="brush:php;toolbar:false;">정적 공개 함수 lockRedisKey($key, $value = "true") {
$redis = RedisClient::getInstance();
$time = 마이크로타임(true);
$exit_time = $time + 10;
$수면 = 10000;
하다 {
// PX 및 NX로 Redis를 잠급니다.
$redis->다중();
$redis->set('lock:' . $key, $value, array('nx', 'ex' => 10));
$ret = $redis->exec();
if ($ret[0] == true) {
사실을 반환;
}
usleep($sleep);
} while (microtime(true) < $exit_time);
거짓을 반환;
}
정적 공개 함수 UnlockRedisKey($key) {
$redis = RedisClient::getInstance();
$redis->다중();
$redis->del("잠금:" . $key);
$redis->exec();
}</pre></p>
"exit_time"이 너무 짧습니다. $exit_time = $time + 10; 은 10초 후에 닫는다는 뜻이라고 생각합니다. 단, 설정시간은 마이크로 시간입니다.
'$exit_time = $time + 10;'을 '$exit_time = $time + 100000;'으로 바꿀 수도 있습니다. Google 번역으로 작성
잠금은 잘 작동합니다. 이는 잠금 사이의 코드에 충돌을 일으키고 잠금이 해제되지 않게 만듭니다. :-)