PHPRedis를 사용하여 잠금 메커니즘 구현
P粉515066518
P粉515066518 2023-08-28 18:33:09
0
2
489

Redis 키를 잠그는 데는 다음 두 가지 기능이 있습니다. Redis를 사용하여 코드 블록의 동시 실행을 방지하려고 합니다. 그래서 내가 한 일은 다른 스레드가 동일한 코드를 실행하는 것을 방지하기 위해 다음 함수를 사용하는 것입니다.

lockRedisKey("ABC"); 동시에 실행하고 싶지 않은 코드! UnlockRedisKey("ABC");

안타깝게도 작동하지 않는 것 같으며 lockRedisKey()가exit_time에 도달할 때까지 무한 반복됩니다. 무엇이 잘못될 수 있나요?

정적 공개 함수 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); }

교착상태에 직면할 수 있다는 것을 알고 트랜잭션을 사용하기로 결정했지만 여전히 이 문제에 직면하고 있습니다.

정적 공개 함수 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(); }

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

    잠금은 잘 작동합니다. 이는 잠금 사이의 코드에 충돌을 일으키고 잠금이 해제되지 않게 만듭니다. :-)

      최신 다운로드
      더>
      웹 효과
      웹사이트 소스 코드
      웹사이트 자료
      프론트엔드 템플릿
      회사 소개 부인 성명 Sitemap
      PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!