Redis Transaction

이정원·2024년 10월 26일
post-thumbnail

ACID 개념 설명

Atomicity (원자성): 트랜잭션의 모든 작업이 성공적으로 완료되거나, 아무것도 수행되지 않은 상태로 돌아가야 한다는 것을 의미함. 일부 작업이 실패할 경우 전체 트랜잭션은 취소되어야 한다.
Consistency (일관성): 트랜잭션이 시작되기 전과 완료된 후에 데이터베이스가 일관된 상태를 유지해야 한다. 즉, 트랜잭션이 완료되면 데이터베이스의 제약 조건이 위반되지 않아야 한다.
Isolation (격리성): 여러 트랜잭션이 동시에 수행될 때, 각 트랜잭션은 다른 트랜잭션의 영향을 받지 않아야 한다. 즉, 각 트랜잭션은 독립적으로 수행되어야 한다.
Durability (지속성): 트랜잭션이 완료되면, 시스템에 문제가 생겨도 그 결과는 영구적으로 저장되어야 한다. 즉, 트랜잭션이 성공적으로 완료된 후의 데이터 변경은 영구적이다.

Redis Transaction 개요

일반적으로 데이터베이스에서 트랜잭션(Transaction)은 데이터베이스의 상태를 변화시키기 위해 수행되는 일련의 작업들을 하나로 묶은 논리적인 작업 단위이다. Redis의 트랜잭션도 여러 명령어를 하나로 묶어 Single Thread 방식으로 내부 큐에 저장하고, 완료 명령을 받으면 일괄 처리한다. 이 방식은 트랜잭션 안에서 설정한 값을 즉시 조회할 수 없지만, 높은 격리성을 제공한다.

Command

  • MULTI: 트랜잭션의 시작을 선언한다. 이후의 명령어들은 내부 큐에 저장된다.
  • EXEC: 내부 큐에 저장된 모든 명령어들을 순차적으로 실행한다.
  • DISCARD: 트랜잭션을 취소하고, 내부 큐에 저장된 모든 명령어를 삭제한다.
  • WATCH: 특정 키를 감시하여, 감시한 키가 다른 클라이언트에 의해 수정되면 트랜잭션을 취소한다. 이를 통해 경쟁 상태에서 데이터 일관성을 유지할 수 있다.

서비스 운용상 문제가 발생할수 있는 명령어

Redis는 클라이언트 요청당 하나씩 Single Thread로 배치 처리하기 때문에 지연이 발생하면 전체 시스템에 부하가 걸린다. 따라서 O(n)의 시간복잡도를 가지는 명령어를 유의 깊게 살펴야한다.

Command

KEYS: Redis에 저장된 모든 키를 조회하는 명령어이다. 만약 데이터가 100만 개 이상이라면, 모든 키를 순차적으로 조회하게 되어 다른 명령어들이 대기해야 한다. 이는 서비스 지연으로 이어질 수 있다.

Data type 관련 명령어: 다음과 같은 자료구조 관련 메서드들은 대규모 데이터에서 성능 문제를 일으킬 수 있다.

LINSERT (List): 리스트의 특정 위치에 요소를 삽입하는 명령어로, 리스트 크기에 따라 성능이 저하될 수 있다.
HKEYS, HGETALL (Hash): 해시 테이블의 모든 키나 모든 필드-값 쌍을 조회하는 명령어로, 해시 크기가 클 경우 응답 시간이 길어질 수 있습니다.
SMEMBERS (Set): 세트에 있는 모든 멤버를 반환하는 명령어로, 세트 크기가 클 경우 문제가 발생할 수 있습니다.

이러한 문제를 완화하기 위해 SCAN 명령어를 사용하여 데이터를 점진적으로 조회할 수 있다. SCAN은 Redis의 데이터 조회 시 데이터 양에 관계없이 빠른 응답으로 인한 Non-Blocking 특징을 가지며 서비스의 성능 저하를 방지한다.

SCAN 명령어는 커서 기반 반복을 제공하여, 여러 번에 걸쳐 작은 청크(chunk) 단위로 데이터를 조회하기 때문에 Redis 서버가 잠기거나 지연되는 상황을 방지한다.

0개의 댓글