>  기사  >  백엔드 개발  >  Redis 잠금을 해제하는 올바른 방법

Redis 잠금을 해제하는 올바른 방법

小云云
小云云원래의
2017-12-14 13:35:582755검색

Redis는 PHP의 좋은 친구입니다. PHP로 비즈니스를 작성할 때 한 사람만이 동시에 특정 동작을 수행할 수 있다는 개념이 사용됩니다. 이때 잠금을 사용해야 합니다. 여러 가지 잠금 방법이 있습니다. PHP는 메모리 잠금을 사용할 수 없으며 ZooKeeper를 사용하여 잠글 수 없습니다. 현재로서는 일반적으로 Redis를 잠금 메커니즘으로 선택합니다. 이 기사에서는 모든 사람에게 도움이 되기를 바라며 Redis를 잠금 해제하는 올바른 방법을 주로 공유합니다.

setnx

redis에 잠긴 가장 간단한 데이터 구조는 문자열입니다. 초창기에는 setnx가 일반적으로 잠금 작업에 사용되었습니다. 이 명령은 :lock이 존재하지 않을 때 val을 설정하는 것입니다. 작업을 잠금 해제하려면 del을 사용하는 것이 좋습니다. 의사 코드는 다음과 같습니다.

if (Redis::setnx("my:lock", 1)) {
  Redis::expire("my:lock", 10);
  // ... do something

  Redis::del("my:lock")
}

여기에 실제로 문제가 있습니다. 문제는 setnx와 만료 사이에 충돌 및 기타 동작이 발생하면 잠금이 해제되지 않을 수 있다는 것입니다. 따라서 추가 최적화 솔루션은 타임스탬프를 잠금에 저장하는 것일 수 있습니다. 타임스탬프의 길이를 결정합니다.

set

이제 set을 직접 사용하여 잠금을 구현하는 것이 공식적으로 권장됩니다. set 명령을 사용하여 다음과 같은 setnx를 대체할 수 있습니다.

if (Redis::set("my:lock", 1, "nx", "ex", 10)) {
  ... do something

  Redis::del("my:lock")
}

위 코드는 my:lock을 1로 설정합니다. 잠금이 존재하지 않는 경우에만 만료 시간은 10으로 설정됩니다. 설정이 완료되었습니다.

잠금을 획득하는 메커니즘은 정확하지만 del을 직접 사용하여 잠금을 삭제하는 메커니즘은 올바르지 않습니다. 실수로 다른 사람의 자물쇠를 삭제할 수도 있기 때문입니다.

예를 들어 이 자물쇠를 10초 동안 잠갔으나 처리 시간이 10초를 초과하면 10초가 지나면 자동으로 자물쇠가 만료되어 다른 사람에게 빼앗기고 다시 잠겼습니다. 그러면 이때 다시 Redis::del을 호출하면 다른 사람이 생성한 잠금이 삭제됩니다.

공식에는 잠금 해제 명령에 대한 제안도 있습니다. lua 스크립트를 사용하고 먼저 get을 수행한 다음 del을 수행하는 것이 좋습니다. , redis로 이동합니다. 이 토큰은 my:lock에 저장되어 있습니다. 잠금을 해제할 때 먼저 잠금에 있는 토큰을 가져옵니다. 삭제하려는 토큰과 일치하면 이전에 잠금이 설정되었음을 의미합니다. 이는 잠금이 만료되었으며 다른 사람이 설정했기 때문에 아무 작업도 수행할 수 없다는 의미입니다.

그러므로 더 이상 setnx를 사용하지 말고 잠금 구현을 위해 set을 직접 사용하세요.

관련 권장 사항:

php redis 잠금을 사용하여 동시 액세스 클래스 제한

php redis 잠금을 사용하여 동시 액세스 클래스 제한 예

php에서 redis를 작동하는 일반적인 방법 요약

위 내용은 Redis 잠금을 해제하는 올바른 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.