redis - PHP 복권 이벤트와 메모리 잠금, 원리는 무엇입니까?
仅有的幸福
仅有的幸福 2017-05-16 13:09:23
0
1
620

PHP 복권 이벤트에 메모리 잠금을 추가하는 원리는 무엇인가요?

 공개 함수 acquire($key) {
        //두 개의 잠금을 동시에 획득해야 하는 경우
        if ( is_array($key) && count($key) == 2 ) {
            동안 (참) {
                $res = 배열();
                foreach($key as $k => $v) {
                    $res[$k] = $this->acquire($v);
                    if ( !$res[$k] ) {
                        부서지다;
                    }
                }
                //첫 번째 잠금을 얻지 못한 경우 직접 반환
                if ( !$res[0] ) {
                    $err = new SysErr(System::MEMCACHE_ACQUIRE_LOCK_ERROR);
                    ErrorHandle::throwErr($err);
                } elseif( !$res[1] ) {
                    //첫 번째 잠금을 해제하고 기다렸다가 다시 시도하세요.
                    $this->release($key[0]);
                    usleep(LockConfig::LOCK_TIMEWAIT);
                } 또 다른 {
                    TRUE를 반환합니다.
                }
            }
        } 또 다른 {
            $lock_key = LockConfig::LOCK_PREFIX .
            $i = 0;
            하다 {
                $lock = $this->_memcache->add( $lock_key, 1, LockConfig::LOCK_TIMEOUT );
                //처음으로 Lock을 획득하지 못한 경우, 지정된 시간 동안 대기한 후 다시 시도한다.
                if ($i > 0) {
                    usleep(LockConfig::LOCK_TIMEWAIT);
                }
                $i++;
                //재시도 횟수 초과 후 종료
                if ($i > LockConfig::LOCK_RETRY_TIMES) {
                    $err = new SysErr(System::MEMCACHE_ACQUIRE_LOCK_ERROR);
                    ErrorHandle::throwErr($err);
                }
            } 동안( !$lock );

            // 기록 로그
            if ($i > 1) {
                LogHelper::warning('lock.log', "{$i}번 동안 '{$lock_key}' 잠금 획득");
            }
            $잠금을 반환합니다.
        }
    }
    
    
      /**
     * 메모리 잠금 해제
     *
     * @param string $key 메모리 잠금의 접두어를 제거한 후의 키 값
     * @return bool 성공적으로 해제되면 TRUE를 반환합니다.
     */
    공개 함수 릴리스($key) {
        $lock_key = LockConfig::LOCK_PREFIX .
        return $this->_memcache->delete($lock_key);
    }
仅有的幸福
仅有的幸福

모든 응답(1)
为情所困

복권에는 메모리락이 필요하지 않습니다. Redis 대기열 또는 트랜잭션을 사용하고 Mysql 잠금을 추가할 수 있어야 합니다. .

원하는 메모리 잠금이 이것이었는지 모르겠습니다:
$lock = new CacheLock('key_name')
$lock->lock();
//logic here
$lock->unlock( );
CacheLock 프로세스 잠금은 캐시가 과도한 SQL 요청이 데이터베이스에 침투하는 것을 방지하지 못할 때 주로 단일 프로세스 캐시 획득에 사용됩니다. 동시성 중 PHP의 잠금 제어를 해결하고 파일을 통해 프로세스 간 잠금을 수행하는 데 사용됩니다. /eaccelerator. 그렇지 않은 경우 eaccelerator를 사용하여 파일 잠금을 처리하고 해당 디렉터리에 해당 세분성으로 잠금을 생성합니다. eaccelerator를 사용하면 처리가 메모리에서 수행되며 성능은 행과 유사하게 상대적으로 높습니다. mysql innodb의 레벨 잠금.

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿