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 자체에서 처리하고 싶은 경우