Isolation & Lock
- Redis는 읽기 일관성과 데이터 공유를 위해 Data Sets(Key/Value) Lock을 제공한다.
- 또한 트랜잭션 제어를 위해 Read Uncommitted와 Read Committed 타입 2가지 유형을 제공한다.
- NoSQL의 많은 제품들 중 관계형 DB의 Commit, Rollback 명령어처럼 트랜잭션 제어가 가능한 제품이 몇 되지 않는데, 그 중 하나가 Redis이다. (이를 Read Uncommitted 타입이라고 표현함)
- 하지만 관계형 DB처럼 Commit, Rollback을 수행하게 되면 초당 100,000 ~ 200,000건 이상의 빠른 쓰기와 읽기 작업에 좋은 성능을 기대할 수 없게 되는 문제점이 발생한다.
- 이를 보완하기 위해 Redis는 Read Committed 타입의 트랜잭션 제어 타입도 제공하고 있다.
- 일반적으로 관계형 DB는 1)Global Lock 2)Database Lock 3)Object Lock 4)Page Lock 5)Key/Value(Data Sets) Lock 의 5가지 유형의 락-메커니즘을 제공하는데, Redis는 5)Key/Value 레벨의 메커니즘을 제공하고 있다.
CAS(Check and Set)
-
하나의 트랜잭션에서 데이터가 변경되는 시점에 다른 트랜잭션에 의해 동일한 데이터가 먼저 변경되는 경우 일관성에 문제가 발생할 수 있다. Redis는 이와 같은 경우 Watch 명령어어를 통해 트랜잭션을 취소할 수 있다.
watch a //다중 트랜잭션 모니터링 시작
multi //트랜잭션 시작
set 1 wsryu
QUEUED
set 2 ryuws
QUEUED
exec
-
데이터 일관성과 공유를 위해서 동시 처리가 발생할 때 먼저 작업을 요구한 사용자에게 우선권을 보장하고 나중에 작업을 요구한 사용자의 세션에서는 해당 트랜잭션에 충돌이 발생했음을 인지할 수 있도록 해야 하는데, 이를 CAS(Check and Set) 이라고 표현한다.
Commit & Rollback
multi
set 1 wsryu
QUEUED
set 2 ryuws
QUEUED
exec //트랜잭션 종료(Commit)
1) OK
2) OK
keys *
1) "1"
2) "2"
multi
set 3 wsryu
set 4 ryuws
discard //트랜잭션 종료(Rollback)
keys *
(empty list or set)