Redis는 다양한 동시성 문제를 해결하기 위한 메커니즘을 제공합니다. WATCH
명령어와 Lock
패턴은 여러 클라이언트가 동시에 같은 데이터에 접근할 때 일관성을 유지하는 데 유용합니다.
WATCH
명령어는 트랜잭션 처리 과정에서 특정 키를 감시하는 데 사용됩니다. 만약 WATCH
로 지정된 키가 다른 클라이언트에 의해 변경되었다면, 이후 실행되는 트랜잭션은 실패하게 됩니다.
WATCH mykey
이후에 MULTI
와 EXEC
명령어를 사용하여 트랜잭션을 구성하고, mykey
에 대한 변경 사항이 없다면 트랜잭션은 성공적으로 실행됩니다. 만약 mykey
가 변경되었다면, EXEC
는 nil
을 반환하며 트랜잭션은 실행되지 않습니다.
Redis에서는 Lock을 구현하기 위해 SET
명령어의 NX
옵션과 만료 시간(EX
옵션)을 함께 사용할 수 있습니다. 이를 통해 분산 락을 구현할 수 있으며, withLock
패턴을 사용하여 자원에 대한 접근을 제어할 수 있습니다.
SET lockKey "myLock" NX EX 5
위 명령어는 lockKey
가 존재하지 않을 경우에만 "myLock"을 설정하고, 5초 후에 만료되도록 합니다. 이를 통해 다른 클라이언트가 lockKey
를 통해 자원에 접근하는 것을 일시적으로 방지할 수 있습니다.
withLock
패턴은 자원에 접근하기 전에 락을 획득하고, 작업이 완료된 후에 락을 해제하는 구조로 구성됩니다. 이 패턴은 다음과 같이 구현할 수 있습니다.
락 해제는 DEL
명령어를 사용하여 수행할 수 있습니다.
DEL lockKey