Beenslab Blog

Redis Pipeline, Transaction, Lua script 차이

beenchangseo·2024년 3월 28일Hits

Redis는 빠르고 단순한 구조 덕분에 대규모 트래픽을 감당하는 서비스에서 자주 활용됩니다. 그중에서도 Transaction, Pipeline, Lua Script는 멀티 명령을 처리할 때 자주 사용되는 고급 기능입니다.

이 포스팅에서는 세 기능의 차이점과 사용 시 유의사항, 그리고 예제까지 정리해보겠습니다.


🔄 Redis Transaction이란?

Redis에서 트랜잭션은 MULTI 명령어로 시작해서 EXEC으로 커밋되는 일련의 명령어 집합입니다.

RDBMS의 트랜잭션과 유사해 보이지만, Rollback은 지원하지 않습니다.

✅ 특징

  • MULTI 호출 후 명령은 큐에 저장됨
  • EXEC을 통해 한꺼번에 실행됨
  • 일부 명령이 실패해도 전체가 중단되진 않음

🧪 예제

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> SET user:1 "Tom"
QUEUED
127.0.0.1:6379> INCR balance
QUEUED
127.0.0.1:6379> EXEC
1) OK
2) (error) ERR value is not an integer or out of range

🚀 Redis Pipeline이란?

Pipeline은 여러 명령을 한 번에 Redis 서버에 전송하여 RTT(Round Trip Time)를 줄이는 기법입니다.

하지만 서버 측 원자성은 보장하지 않으며, 순서대로 처리하되 다른 클라이언트의 명령과 교차 실행될 수 있습니다.

✅ 특징

  • 빠른 처리와 네트워크 절감 목적
  • 원자성 없음 (트랜잭션과 다름)
  • 클라이언트 측 최적화 기법

🧪 예제 (Node.js ioredis)

const Redis = require("ioredis");
const redis = new Redis();
const pipeline = redis.pipeline();
pipeline.set("a", 1);
pipeline.incr("a");
pipeline.get("a");
pipeline.exec().then(console.log);

결과:

[
[null, 'OK'],
[null, 2],
[null, '2']
]

⚔️ Transaction vs Pipeline

항목TransactionPipeline
원자성 보장
실행 시점EXEC 호출 시서버 도착 즉시
중간 개입 방지
네트워크 절감
중간 조건 분기

🧠 Lua Script란?

Lua Script는 Redis에 내장된 스크립트 엔진으로, 복잡한 로직을 원자적으로 실행할 수 있는 수단입니다.

조건문, 반복문, 분기처리까지 가능하며 트랜잭션의 단점을 보완해줍니다.

✅ 특징

  • 단일 명령처럼 실행됨 (atomic)
  • 중간 결과 참조 가능
  • 조건 분기 및 제어 가능

🧪 예제

-- 재고가 있을 경우에만 감소
local stock = tonumber(redis.call('GET', KEYS[1]))
if stock > 0 then
	redis.call('DECR', KEYS[1])
	return '구매 성공'
else
	return '품절'
end

🧩 언제 무엇을 사용해야 할까?

상황추천 기능
네트워크 RTT 절감Pipeline
명령의 원자성 보장Transaction
조건 기반 로직 처리Lua Script
중간 결과 참조 필요Lua Script
성능 최적화 + 원자성 둘 다 필요Transaction + Pipeline 적용된 클라이언트

✍️ 마무리

  • Pipeline빠르게 처리하고 싶은 경우
  • Transaction여러 명령을 원자적으로 처리하고 싶은 경우
  • Lua Script조건 분기, 반복 처리 등 복잡한 로직을 Redis 자체에서 처리하고 싶은 경우