Redis의 multi vs pipeline

multi

트랜잭션을 구현할 때 사용한다.

트랜잭션 내의 모든 명령을 수행시키는 명령은 exec

취소시키는 명령은 discard이다.

ALL OR NOTHNIG이다.


RDB의 트랜잭션과는 좀 다르다.

RDB는 A라는 트랜잭션에서 a라는 자원을 사용중 일때

          B라는 트랜잭션에서 a라는 자원을 사용한다면,

          B 트랜잭션은 A 트랜잭션이 종료할 때까지 대기한다.


하지만, 레디스의 트랜잭션은 exec를 호출하기 전까지, 

또다른 클라이언트로 부터 전달된 명령에 의해 

트랜잭션 내에서 사용하는 자원을 또다른 클라이언트에서 사용할 수 있다.

(물론 싱글쓰레드이기 때문에, 명령을 처리할 때는 다른 명령을 처리하지 않는다.)


트랜잭션 내의 자원이 변경되었는지 감지하는  WATCH명령어가 존재한다.

예) 아래 명령을 여러 개의 클라이언트에서 동시에 실행한다면, 

서버에 전달된 명령이 GET mykey GET mykey SET mykey $val SET mykey $val 순서로

전달된다고 했을 때, 최초 val = 10이었다면, 11로 저장이 된다.


val = GET mykey val = val + 1 SET mykey $val


WATCH명령을 이용한다면, EXEC를 호출하는 시점에 

mykey 값이 변경되었는지를 감지하고 변경되었다면 실패시킨다.

즉, 하나의 클라이언트만 성공하고 다른 클라이언트는 모두 실패 처리된다.

WATCH mykey val = GET mykey val = val + 1 MULTI SET mykey $val EXEC



pipeline

커맨드를 요청할 때마다, 서버로 전송하는 것이 아니라,

커맨드를 모아서 서버에 전송시킨다.

네트워크 오버해드를 줄이기 위한 목적으로 주로 사용된다.

하지만, 커맨드는  TCP 패킷으로 나뉘어 전송되어, 

전부 전송되기 전에 오류가 발생한다면, 일부만 실행되고, 나머지는 실행되지 않는 현상이 발생한다.