Redis에는 잠금 메커니즘이 없으며 여러 사용자 연결에 대한 경쟁 문제가 없습니다.
그러나 동시성 중에 연결 시간 초과, 연결 차단, 연결 종료 등의 오류가 발생할 수 있습니다. (권장 학습: Redis 비디오 튜토리얼)
일반적으로 클라이언트 측에서 연결을 풀링하거나(예: Redis를 읽고 쓸 때 동기화 사용 및 내부 잠금 추가) 서버 측에서 Redis 자체 트랜잭션을 사용할 수 있습니다. 잠금을 구현하려면 setnx 명령을 처리하세요.
전자 상거래 활동에서는 "플래시 세일" 판매 활동이 종종 발생합니다. 이 시나리오에서는 일반적으로 서버가 높은 동시 요청 처리에 직면하게 됩니다.
즉, 동시에 특정 상품을 구매하는 동시 이용자가 많아지게 되는데, 이때 과잉 판매(결국 상품 수)가 발생하는지 확인해야 합니다. 사용자가 구매한 제품이 실제 제품 개수를 초과하는 경우)
여기서는 redis의 잠금 및 잠금 해제 기능을 적용하여 더티 데이터로 이어지는 경쟁을 피하기 위해 한 명의 사용자만 각 쇼핑 작업을 수행하도록 해야 합니다.
이제 올바른 잠금 및 잠금해제 사용법을 소개하겠습니다.
setnx
redis에서는 잠금 작업에 set 명령을 사용할 것을 공식적으로 권장합니다. 사용 방법은 다음과 같습니다.
if ($redis->set('my:lock', 1, ['NX'])) { # todo $redis->del('my:lock'); }
여기서
NX — 키가 존재하지 않는 경우에만 설정된다는 의미입니다. 문제는 클라이언트가 잠금을 획득한 후 충돌이 발생하거나 잠금을 해제하지 않고 계속 점유하는 경우 교착 상태가 발생하여 후속 사용자가 작업에 대한 잠금을 획득할 수 없게 된다는 것입니다. 따라서 이 작업은 시간 초과를 설정해야 합니다.
setnx 개선위 방법의 문제점에 대응하여 만료 방법을 사용하여 시간 초과를 설정합니다. 그런데 여기서 문제가 해결된 걸까요?
안돼! 여기서 만료는 원자적 작업이 아니기 때문에 setnx 작업 후 클라이언트가 충돌하면 이때 제한 시간이 성공적으로 설정되지 않으며 이로 인해 잠금 작업에서도 위의 문제가 발생하게 됩니다.
if ($redis->set('my:lock', 1, ['NX'])) { $redis->expire('my:lock', 10); # todo $redis->del('my:lock'); }
더 많은 Redis 관련 기술 기사를 보려면
Redis 데이터베이스 사용 튜토리얼 소개위 내용은 데이터를 저장할 때 Redis가 잠기나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!