문제 설명:
한 전자상거래 플랫폼에서 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!