저는 PHPer가 트랜잭션을 어느 정도 알고 있다고 믿습니다. 트랜잭션은 일부 시나리오에서 자주 사용됩니다. 예를 들어, 제품을 구매하는 경우 주문 테이블에 데이터를 삽입해야 하고, 사용자 테이블의 잔액 필드를 수정해야 합니다. 이 두 작업은 함께 성공하거나 둘 다 실패해야 합니다. 그렇지 않으면 데이터 불일치가 발생합니다.
Redis는 트랜잭션 기능도 지원합니다. 기존 관계형 데이터베이스의 트랜잭션 기능만큼 강력하지는 않지만 사용이 매우 간단합니다.
Transaction
MULTI
multi는 거래의 시작을 의미합니다. EXEC가 실행될 때 후속 명령은 원자적으로 실행됩니다.
DISCARD
Discard 명령은 트랜잭션을 취소하고 트랜잭션 블록 내의 모든 명령 실행을 중단하는 데 사용됩니다.
EXEC
exec 명령은 모든 트랜잭션 블록 내에서 명령을 실행하는 데 사용됩니다.
위의 세 가지 명령을 소개한 후 사용자 주의를 기울여 작은 기능을 완성해 보겠습니다.
예를 들어 사용자 A가 B를 따르는 경우 다음이 필요합니다. A의 팔로우 목록에 B를 추가하고 B의 팬 목록에 A를 추가하려면 이 두 작업을 Atom으로 수행해야 합니다.
구현 코드는 다음과 같습니다.
$redis->multi() ->sadd('like:A', 'B') ->sadd('fans:B', 'A') ->exec();
사용법이 아주 간단하죠?
Optimistic Lock
먼저 낙관적 잠금이 무엇인지, 그에 따른 비관적 잠금이 무엇인지 소개하겠습니다.
비관적 잠금: 내 생각은 매우 비관적입니다. 남자 친구와 함께 있는 한 누구도 그의 남자 친구를 건드릴 수 없습니다. MySQL의 행 잠금, 테이블 잠금 등은 모두 비관적 잠금입니다.
낙관적 잠금: 그녀는 매우 낙천적이고 순진합니다. 그녀는 남자 친구와 함께 있을 때 다른 친구들이 그녀의 남자 친구와 이야기를 나누고 싶어할 때 그녀를 막지 않을 것입니다. 하지만 두 사람이 함께 있을 때마다 그녀는 남자친구의 근황을 평가하고 그에게 무슨 문제가 있는지 판단하게 된다. 나는 문제가 없을 경우에만 그와 계속 함께 있을 것입니다. 그렇지 않으면 작별 인사입니다.
아래 시나리오가 있습니다. Redis는 토큰을 저장하지만 이 토큰은 가끔씩 업데이트해야 합니다. 비관적 잠금이 하는 일은 수정하기 전에 잠가야 한다는 것입니다. 이때는 수정을 완료할 때까지 다른 요청이 이를 수정할 수 없습니다. 낙관적 잠금의 접근 방식은 수정 시 잠기지 않지만 수정 전에 상태를 관찰하고, 수정되지 않은 경우 수정을 수행하며, 상태가 변경되면 수정하지 않습니다. . ,
Redis에서 낙관적 잠금을 사용하는 방법은 무엇입니까?
Redis는 지정된 모든 키를 트랜잭션에서 조건부로 모니터링하고 실행하도록 표시하는 Watch 명령을 제공합니다.
다음은 의사 코드입니다.
$redis->watch('token'); $redis->multi() ->set('token','sfwefawfwefa323') ->exec();
낙관적 잠금과 비관적 잠금에는 고유한 사용 시나리오가 있으므로 관련 정보는 직접 확인할 수 있으므로 여기서는 자세히 설명하지 않겠습니다.
위 내용은 Redis 트랜잭션 및 낙관적 잠금 적용의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!