Redis Pipeline, Transaction, Lua script 차이
Redis Pipeline, Transaction, Lua script 차이를 정리한 포스팅입니다.
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
| 항목 | Transaction | Pipeline |
|---|---|---|
| 원자성 보장 | ✅ | ❌ |
| 실행 시점 | 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 자체에서 처리하고 싶은 경우