>  기사  >  데이터 베이스  >  데이터를 저장할 때 Redis가 잠기나요?

데이터를 저장할 때 Redis가 잠기나요?

(*-*)浩
(*-*)浩원래의
2019-11-23 10:02:533866검색

데이터를 저장할 때 Redis가 잠기나요?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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