>  Q&A  >  본문

PHPRedis를 사용하여 잠금 메커니즘 구현

<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>
P粉515066518P粉515066518388일 전554

모든 응답(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
  • 취소회신하다