> 데이터 베이스 > Redis > Redis가 분산 트랜잭션을 구현하는 방법

Redis가 분산 트랜잭션을 구현하는 방법

步履不停
풀어 주다: 2019-06-22 13:54:14
원래의
6824명이 탐색했습니다.

Redis가 분산 트랜잭션을 구현하는 방법

문제 설명:

한 전자상거래 플랫폼에서 1인당 2개 구매로 제한됩니다. 이 경우 동시 소비량이 10W가 될 것으로 예상됩니다. , 재고를 차감하면 보증 과매도되지 않습니다

해결책 1

작업을 수행하기 전에 데이터베이스 잠금 메커니즘을 사용하여 레코드를 잠그세요

SELECT * from goods where ID =1 for update;
UPDATE goods set stock = stock - 1;
로그인 후 복사

배타적 잠금을 사용하여 병렬 작업을 직렬 작업으로 변환하지만 성능과 이 솔루션의 사용자 경험은 좋지 않습니다

해결책 2

redis를 사용하여 분산 잠금을 구현합니다.

setnx 명령을 사용합니다(키가 없으면 값을 생성하고 설정한 후 1을 반환합니다. 키가 있으면 0을 반환하여 잠금을 얻으려면 비즈니스 로직에서 이러한 방식을 통해 작동할 수 있습니다. 잠금을 해제할 수 없는 경우 get 명령을 통해 잠금의 타임스탬프를 얻을 수 있으며 이를 사용하여 시간 초과를 판단하고 해제할 수 있습니다

Jedis client = jedisPool.getResource();
        while(client.setnx("lock",String.valueOf(System.currentTimeMillis())) == 0){
            Thread.sleep(10000);
        }
        //coding here 
       client.del("lock")
로그인 후 복사

옵션 2가 강화됩니다

옵션 2의 알고리즘에서 시간 초과가 아닌 상황에서는 잠금이 있는 스레드에 의해서만 잠금이 해제될 수 있습니다. 이를 값의 타임스탬프에 추가하고 스레드 기능 코드의 철자를 입력할 수 있습니다.

    Long TIMEOUT_SECOUND = 120000L;
        Jedis client = jedisPool.getResource();
        while(client.setnx("lock",String.valueOf(System.currentTimeMillis())) == 0){
            Long lockTime = Long.valueOf(client.get("lock"));
            if (lockTime!=null && System.currentTimeMillis() > lockTime+TIMEOUT_SECOUND) {
                client.del("lock");
            }
            Thread.sleep(10000);
        }
        ...........................
        ...........................
        client.del("lock")
로그인 후 복사

더 많은 Redis 관련 기술 기사를 보려면 다음을 방문하세요.

Redis Tutorial 배울 수 있는 칼럼!

위 내용은 Redis가 분산 트랜잭션을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿