Redis 트랜잭션 시작하기

이상문
3 min readMay 2, 2023

--

Redis는 많은 개발자가 빠르고 확장 가능한 애플리케이션을 구축하는 데 사용하는 인기 있는 인메모리 데이터 저장소이다. 속도, 유연성, 사용 편의성으로 잘 알려져 있다. 그러나 분산 시스템에서는 데이터 일관성을 보장하는 것이 어려울 수 있다. 바로 Redis 트랜잭션이 필요한 이유이다. 이 글에서 Redis 트랜잭션이 무엇인지, 어떻게 작동하는지, 프로젝트에서 어떻게 구현할 수 있는지 정리하고자 한다.

Redis의 트랜잭션이란 무엇인가

Redis의 트랜잭션은 여러 Redis 명령을 단일 원자(atomic) 연산으로 그룹화하는 데 사용된다. 즉, 트랜잭션의 모든 명령이 성공할 수도 있고 실패할 수도 있다. 트랜잭션은 동일한 데이터에 대한 동시 액세스를 방지하여 분산 시스템에서 데이터 일관성을 보장하는 데 도움을 준다.

Redis에서 트랜잭션 구현

Redis에서 트랜잭션을 구현하는 것은 비교적 간단하다.

  1. multi 명령을 사용하여 트랜잭션을 시작한다. 이 명령은 실행 명령이 호출될 때까지 그 뒤에 오는 모든 명령을 함께 그룹화하도록 Redis에 지시한다.
  2. multi 명령과 exec 명령 사이에 하나 이상의 Redis 명령을 호출한다. 이러한 명령은 SET, GET, INCR 등과 같이 일반적으로 Redis에서 실행하는 모든 명령이 될 수 있다.
  3. 트랜잭션을 실행하려면 exec 명령을 사용한다. 이 명령은 다중 명령으로 그룹화된 모든 명령을 단일 원자 연산으로 실행한다.
const redis = require("redis");
const client = redis.createClient();

client.multi()
.set("name", "test")
.incr("connCount")
.exec((err, replies) => {
console.log(replies);
});

이 예시에서는 multi 명령으로 트랜잭션을 시작한다. 그런 다음 SET 명령을 호출하여 foo 키의 값을 bar로 설정하고 INCR 명령을 호출하여 baz 키의 값을 증가시킨다. 마지막으로 exec 명령을 사용하여 트랜잭션을 실행한다. 콜백 함수의 replies 변수에는 트랜잭션의 결과가 포함된다.

exec() 메서드를 통해 replies 배열에 모든 명령의 실행 결과가 담긴다. replies는 트랜잭션 블록의 명령과 동일한 순서로 정렬된다.

따라서 replies 배열의 길이는 트랜잭션의 명령 수와 동일하다. 트랜잭션을 실행하는 동안 오류가 발생한 경우 오류는 배열의 첫 번째 요소가 된다. 오류가 없으면 배열의 첫 번째 요소는 null이 된다.

트랜잭션의 각 명령에 대해 응답은 사용된 특정 명령에 따라 달라진다. 예를 들어 사용된 명령이 GET인 경우 응답은 지정된 키와 연관된 값이며, 키가 존재하지 않는 경우 null이 된다. 마찬가지로 사용된 명령이 INCR인 경우, 응답은 지정된 키의 증가된 값이다.

한 가지 중요한 점은 replies 배열은 Redis에 저장된 데이터 유형에 관계없이 항상 문자열 배열이다. 따라서 반환된 값을 숫자 계산에 사용하려면 먼저 숫자로 파싱하는 것이 좋다.

마무리

짧은 글이었지만 Redis 트랜잭션을 어떻게 동작하고 구현하는지에 대해서 정리해 보았다.

--

--

이상문
이상문

Written by 이상문

software developer working mainly in field of streaming, using C++, javascript

No responses yet