🔹 루아 스크립트(Lua Script)는 개발자가 직접 작성해야 하는 코드입니다.
Redis가 자동으로 만들어주거나 실행해주는 건 아닙니다.
🔍 자세히 설명드리면
✅ 1. 루아 스크립트는 “Redis 서버 안에서 실행되는 코드”
보통은 우리가 애플리케이션(Python, Node.js, Java 등) 코드에서
SET, GET, INCR 같은 명령을 하나씩 Redis로 보냅니다.
이건 “명령 수준”의 조작이에요.
그런데 어떤 로직은 “명령 여러 개를 한 번에, 원자적으로” 실행해야 할 때가 있죠.
예를 들어 👇
1) 재고가 1 이상이면 구매 처리
2) 재고 차감
3) 구매 로그 남기기
이런 작업을 단순 명령으로 하면 사이사이에 다른 요청이 끼어들 수 있어서 경쟁 상태(race condition)가 생깁니다.
그래서 Redis는 이런 복잡한 로직을 서버 쪽에서 한 번에 처리하도록
루아(Lua) 스크립트 실행 기능을 제공합니다.
local stock = redis.call('GET', KEYS[1])
if tonumber(stock) > 0 then
redis.call('DECR', KEYS[1])
redis.call('LPUSH', 'purchases', ARGV[1])
return 'success'
else
return 'sold out'
end
이 코드를 EVAL 명령으로 Redis에 보내면
서버 내부에서 한 번에, 원자적으로 실행됩니다.
EVAL "<위 스크립트>" 1 product:123 user42
✅ 2. Redis는 “자동으로 루아를 만들어주지 않는다”
Redis는 SQL처럼 “복잡한 쿼리 최적화”를 해주는 DB가 아니라,
명령어 단위의 키-값 저장소예요.
따라서 “조건문, 반복문, 집계” 같은 복잡한 로직이 필요할 때는
개발자가 직접 루아로 작성해서 서버에 전달해야 합니다.
Redis는 루아 엔진을 내장하고 있지만, 자동으로 스크립트를 생성하거나 변환하지 않습니다.
예를 들어 “재고가 1 이상인 상품만 차감해줘” 같은 조건 로직은
Redis 명령으로는 불가능하고, 루아 스크립트를 직접 써야 합니다.
✅ 3. 개발자는 스크립트를 직접 입력하거나 등록할 수 있다
직접 즉석 실행 (EVAL):
EVAL "return redis.call('GET', KEYS[1])" 1 mykey
서버에 등록 후 호출 (FUNCTION):
-- mylib.lua
#!lua name=mylib
local function myget(keys, args)
return redis.call('GET', keys[1])
end
redis.register_function('myget', myget)
cat mylib.lua | redis-cli -x FUNCTION LOAD REPLACE
FCALL myget 1 mykey
✅ 4. 일반 개발자 입장에서는 이렇게 생각하면 돼요
구분 설명
Redis 명령어 단순한 데이터 조작 (SET, GET, INCR 등)
파이프라인 여러 명령을 빠르게 전송 (성능 향상용)
루아 스크립트 여러 명령을 논리적으로 묶고 조건/계산을 추가 (원자적 실행)
Redis 함수(Function) 루아 스크립트를 서버에 등록해 재사용 가능하게 만든 것
✅ 5. Redis가 자동으로 “복잡한 쿼리”를 만들어주는 경우는 없다
SQL DB(MySQL, PostgreSQL)는 쿼리를 분석해 내부에서 최적화된 실행계획을 세우죠.
Redis는 그런 “쿼리 엔진”이 없어요.
대신 개발자가 필요한 로직을 루아로 짜서 서버 안에서 실행되게 해야 합니다.
그래서 루아 스크립트는 “Redis용 프로시저 언어” 같은 역할을 합니다.
🔸 요약
질문 답변
루아 스크립트는 누가 작성하나요? ✅ 개발자가 직접 작성해야 합니다.
Redis가 복잡한 쿼리를 자동으로 루아로 만들어주나요? ❌ 아니요, 직접 써야 합니다.
언제 써야 하나요? 여러 명령을 하나의 원자적 연산으로 묶거나, 조건/루프 로직이 필요할 때
대체 기능이 있나요? Redis 7.0부터는 FUNCTION(레디스 함수)를 등록해서 재사용 가능
Redis 고급 기능 정리: 파이프라인과 루아(Lua) 스크립트 완전 가이드
실무에서 Redis를 더 빠르고 견고하게 쓰기 위해 꼭 알아야 할 파이프라인과 루아 스크립트를 개념→사용법→실행 흐름→운영 팁 순으로 정리했습니다.
목차
파이프라인이란?
파이프라인 vs. 루아 스크립트 — 언제 무엇을 써야 할까
루아 스크립트 한눈에 보기
루아 스크립트 실행 과정(내부 동작)
EVAL / EVALSHA / SCRIPT LOAD·EXISTS·FLUSH
읽기 전용 스크립트(EVAL_RO/EVALSHA_RO)와 플래그
장시간/오류 스크립트 다루기: SCRIPT KILL, SHUTDOWN NOSAVE, 디버깅(ldb)
모범 사례와 체크리스트
예제 모음
1) 파이프라인이란?
파이프라인(pipeline) 은 이전 요청의 응답을 기다리지 않고 여러 명령을 한 번에 연달아 보낸 뒤, 응답도 묶어서 받는 방식입니다.
핵심 효과는 네트워크 RTT(Round Trip Time) 절약으로, 동일한 작업이라도 왕복 횟수가 줄어 총 소요 시간이 크게 감소합니다.
특징
여러 명령을 동시에 송신, 응답은 나중에 한 번에 수신
네트워크 지연이 큰 환경에서 체감 성능 향상이 큼
구현이 매우 간단(클라이언트가 요청을 버퍼링했다가 전송)
한계/주의
명령 간 의존성이 있을 때(앞의 결과를 보고 다음 명령을 결정해야 할 때) 파이프라인만으로는 해결이 어렵다.
원자성(atomicity) 보장 없음. 중간에 오류가 나면 나머지는 계속 실행될 수 있음.
클라이언트가 한꺼번에 전송/수신하므로 버퍼 메모리/에러 처리에 신경 써야 함.
즉, 단순히 여러 독립 명령을 빠르게 보내고 싶을 때는 파이프라인이 최적입니다.
2) 파이프라인 vs. 루아 — 언제 무엇을 쓸까
상황 추천 기술
독립적인 GET/SET 다수를 빠르게 처리 파이프라인
여러 명령을 하나의 원자적 작업으로 묶어야 함 루아 스크립트
“읽기 결과를 보고 다음 쓰기를 결정” 같은 분기/조건 처리 루아 스크립트
네트워크 RTT만 줄이면 충분 파이프라인
클러스터/라우팅을 고려해 접근 키를 명시하며 실행 루아 스크립트(키 전달 필수)
3) 루아 스크립트 한눈에 보기
Redis는 내장 루아(Lua) 인터프리터로 스크립트를 실행합니다. 보통 EVAL(또는 EVALSHA) 명령으로 실행하며, 서버 안에서 일련의 Redis 명령을 원자적으로 수행합니다.
장점
원자성 보장: 스크립트 전체가 하나의 트랜잭션처럼 처리
분기/반복/집계 등 복잡 로직을 서버 측에서 수행 → 왕복 감소 + 일관성 확보
여러 키를 동시에 다루거나 결과를 가공해 반환 가능
파이프라인 대비 오버헤드 감소(왕복 1회)
단점/주의
스크립트가 오래 실행되면 서버가 바빠짐(다른 클라이언트 지연)
클러스터에서는 스크립트가 참조하는 모든 키가 같은 슬롯이어야 함(키 지정 중요)
무한 루프/대용량 처리는 금물 → 제한/디버깅 도구 필요
4) 루아 스크립트 실행 과정(내부 동작)
루아 스크립트는 아래 인자 규칙으로 실행합니다.
EVAL
KEYS[1..N] → 키 인자(라우팅/격리 목적)
ARGV[1..M] → 일반 인자(값, 옵션 등)
실행 흐름은 다음과 같습니다.
전달: 클라이언트가 스크립트와 numkeys, key/arg를 서버에 전송
로드/해시: 서버가 스크립트를 로드하고 SHA1을 계산(직접 EVAL 시 즉시 실행)
실행: 스크립트 내부에서 redis.call('SET', ...) 같은 Redis 명령들을 동기적으로 수행
원자성 보장: 스크립트 전체가 하나의 작업으로 처리되어 중간 상태가 노출되지 않음
결과 반환: 마지막 표현식/반환값을 클라이언트에 전달
포인트: 반드시 접근할 키는 KEYS에 넣고, 나머지 값은 ARGV로 전달하세요(클러스터/보안/최적화 측면에서 권장).
5) EVAL / EVALSHA / SCRIPT LOAD·EXISTS·FLUSH
EVAL
스크립트 본문을 직접 전달하여 실행.
예:
redis-cli EVAL "return ARGV[1]" 0 hello
→ hello 반환
SCRIPT LOAD → EVALSHA
사전 로드해 해시(SHA1)를 얻고, 이후에는 해시로 실행(네트워크 전송량 절약, 재사용 용이)
redis-cli SCRIPT LOAD "return redis.call('GET', KEYS[1])"
redis-cli EVALSHA 1 mykey
SCRIPT EXISTS
특정 SHA1 스크립트가 서버에 올라와 있는지 확인
redis-cli SCRIPT EXISTS
SCRIPT FLUSH
서버에 캐시된 모든 스크립트 제거(운영환경에서는 신중히)
redis-cli SCRIPT FLUSH
6) 읽기 전용 스크립트(EVAL_RO/EVALSHA_RO)와 스크립트 플래그
Redis 7.0+에서는 읽기 전용 모드가 도입되었습니다.
EVAL_RO / EVALSHA_RO: 스크립트 내에서 쓰기 금지, 읽기만 허용
읽기 트래픽 분리에 유용, 복제/클러스터 환경에서 부하/안전성 향상
스크립트 상단 플래그(주석)
루아 파일 맨 위에 주석 형태로 스크립트 동작 제약을 선언할 수 있습니다.
#!lua flags=no-writes,allow-stale
local result = redis.call('get', 'x')
return result
대표 플래그:
no-writes : 쓰기 금지 스크립트
allow-oom : OOM 상황에서도 실행 허용
allow-stale : 리더와의 연결이 잠시 끊긴 복제본에서도 실행 허용
no-cluster : 클러스터 환경에서는 실행 불가(단일 서버 전용)
allow-cross-slot-keys : 크로스 슬롯 키 접근 허용(특수 상황에서만)
플래그는 안전장치이자 의사소통 도구입니다. 팀/운영 정책에 맞춰 적극 활용하세요.
7) 장시간/오류 스크립트 다루기
(1) 스크립트 중단: SCRIPT KILL
실행 중인 스크립트를 중단.
단, 이미 쓰기 명령을 실행한 스크립트는 안전을 위해 KILL이 거부될 수 있음.
redis-cli SCRIPT KILL
실패 시 “UNKillable … already executed write commands…” 오류를 볼 수 있습니다.
(2) 최후 수단: SHUTDOWN NOSAVE
스크립트가 루프 등으로 서버를 붙잡고 있을 때 서버를 중지(데이터 저장 없이)
모든 클라이언트 연결 종료, AOF 미완료 기록은 폐기될 수 있으므로 운영환경에서는 신중.
redis-cli SHUTDOWN NOSAVE
(3) 디버깅: redis-cli ldb(루아 디버거)
--ldb(인터랙티브), --ldb-sync-mode(실행 중지/단계 실행) 지원
redis-cli --ldb --eval debug-sample.lua
(lua debugger) help
주요 명령: s(step), n(next), c(continue), b(break), p(print var), eval(루아 코드 실행), redis(Redis 명령 실행) 등.
8) 모범 사례와 체크리스트
키는 반드시 KEYS로 전달, 값/옵션은 ARGV로 전달
(클러스터 라우팅/복제/감사/성능 최적화)
실행 시간은 짧게: 대용량 루프·복잡 집계는 배치/스트림으로 분리
에러 처리: 입력 검증, 반환 형식(테이블/스칼라) 표준화
읽기/쓰기 분리: 읽기만 필요하면 EVAL_RO 사용, 플래그 no-writes 고려
재사용: SCRIPT LOAD + EVALSHA로 네트워크/파싱 비용 절감
운영 가드레일
장애 유발 시나리오 대비: SCRIPT KILL, SHUTDOWN NOSAVE 드릴북 문서화
정기 점검 시 SCRIPT EXISTS로 캐시 상태 확인, 필요 시 FLUSH(신중)
선택 기준
RTT만 줄이면 → 파이프라인
원자성/분기/집계 필요 → 루아
9) 예제 모음
9.1 원자적 멀티 작업 + TTL 설정
-- KEYS[1]=user:{id}
-- ARGV[1]=name, ARGV[2]=age, ARGV[3]=email, ARGV[4]=ttlSec
redis.call('HSET', KEYS[1], 'name', ARGV[1], 'age', ARGV[2], 'email', ARGV[3])
redis.call('EXPIRE', KEYS[1], ARGV[4])
return 'OK'
redis-cli EVAL "$(cat set_user.lua)" 1 user:42 "taro" 30 "taro@example.com" 3600
9.2 여러 Set의 크기 합계를 계산해 반환
-- KEYS[*] = set 키들
local counts = {}
for i, key in ipairs(KEYS) do
counts[i] = redis.call('SCARD', key)
end
return counts
redis-cli EVAL "$(cat scard_many.lua)" 2 user:1:votes user:2:votes
9.3 계산 로직(루프/누적) 예시
-- ARGV[1] = n
local val = 0
for i = 1, tonumber(ARGV[1]) do
val = val + i
end
return val
redis-cli EVAL "$(cat sum.lua)" 0 10
9.4 SCRIPT LOAD → EVALSHA
SHA=$(redis-cli SCRIPT LOAD "return redis.call('GET', KEYS[1])")
redis-cli EVALSHA $SHA 1 mykey
9.5 읽기 전용 모드 + 플래그
#!lua flags=no-writes,allow-stale
return redis.call('GET', KEYS[1])
redis-cli EVAL_RO "$(cat ro.lua)" 1 mykey
9.6 디버거 사용 예
redis-cli --ldb --eval debug-sample.lua
마무리
파이프라인: 간단·빠름·원자성 없음(왕복 줄이기 용도)
루아 스크립트: 서버 측 원자적 실행 + 복잡 로직 처리에 최적
운영에서는 읽기 전용 모드/플래그/디버거/중단 명령을 함께 익혀야 안전합니다.
Redis 고급 기능 정리 (2) — 레디스 함수, 플래그, 트랜잭션
이번 글에서는 루아 함수(Redis Function), 플래그(no-writes), 그리고 트랜잭션(MULTI/EXEC)의 동작과 차이를 정리합니다.
이전 편(루아 스크립트, 파이프라인)과 연결되어 있으며 Redis 7.0 이상 기준으로 설명합니다.
1️⃣ 레디스 함수 (Redis Functions)
✅ 개요
Redis 7.0부터 이페머럴 스크립트(Ephemeral Script)의 단점을 개선하기 위해 Redis Functions 기능이 도입되었습니다.
기존 루아 스크립트는 실행 시점마다 스크립트를 업로드해야 했고, 재사용이나 버전 관리가 불편했습니다.
이에 반해 레디스 함수는 서버에 사전 등록된 루아 코드 조각(라이브러리)을 불러 실행하는 구조로,
더 빠르고 재사용 가능한 서버 측 코드 관리를 제공합니다.
💡 즉, 루아 스크립트를 서버에 “함수로 등록”하고, FCALL 명령으로 호출하는 개념입니다.
✅ 기존 문제점 (이페머럴 스크립트의 한계)
스크립트 코드를 애플리케이션 내부에 포함해야 함 → 배포/관리 어려움
서버 재시작 시 로드 필요, 코드 중복 가능성
독립 개발/테스트 어려움
SHA1 해시 관리 및 충돌 가능성
키/값 인자 분리 문제(KEYS vs ARGV)
✅ 함수 구조와 등록
레디스 함수는 라이브러리 단위로 구성되며, 각 라이브러리에는 여러 함수를 등록할 수 있습니다.
등록은 FUNCTION LOAD 명령으로 수행합니다.
-- mylib.lua
#!lua name=mylib
local function sum(keys, args)
local val = 0
for i = 1, args[1] do
val = val + i
end
return val
end
redis.register_function('calculator', sum)
등록 명령:
cat mylib.lua | redis-cli -x FUNCTION LOAD REPLACE
호출 명령:
127.0.0.1:6379> FCALL calculator 0 10
(integer) 55
⚙️ “0”은 키의 개수를 의미합니다.
KEYS 없이 단순 계산만 하는 함수라면 0을 지정합니다.
✅ 함수 관리 명령어
명령 설명
FUNCTION LIST 등록된 라이브러리/함수 목록 확인
FUNCTION DELETE 지정 라이브러리 삭제
FUNCTION FLUSH 모든 라이브러리 삭제
FUNCTION DUMP 모든 함수와 라이브러리를 dump
FUNCTION RESTORE dump한 함수 복원
FUNCTION STATS 함수 실행 통계 확인 (엔진, 실행 횟수 등)
예시:
127.0.0.1:6379> FUNCTION STATS
1) "running_script"
2) (nil)
3) "engines"
4) 1) "LUA"
2) "libraries_count" (integer) 1
3) "functions_count" (integer) 3
2️⃣ 레디스 함수 플래그 (Flags)
루아 함수는 기본적으로 쓰기 가능(write-enabled) 상태로 동작하지만,
읽기 전용으로 제한하려면 no-writes 플래그를 사용합니다.
예시
#!lua name=mylib
local function sum(keys, args)
local val = 0
for i = 1, args[1] do
val = val + i
end
return val
end
redis.register_function{
function_name='calculator',
callback=sum,
flags={'no-writes'}
}
등록:
cat mylib.lua | redis-cli -x FUNCTION LOAD REPLACE
읽기 전용 실행:
FCALL_RO calculator 0 10
(integer) 55
💬 no-writes 플래그를 설정하지 않은 함수는 FCALL_RO로 실행 시 오류 발생
→ (error) ERR Can not execute a script with write flag using *_ro command
3️⃣ Redis의 루아 프로그래밍
루아는 Redis 서버 내부의 샌드박스(Sandbox) 환경에서 실행되며,
외부 I/O는 차단되고 Redis 명령만 사용할 수 있습니다.
사용 가능한 내장 라이브러리:
base
table
string
math
struct
cjson / cmsgpack / bit
redis (Redis 전용 API)
Redis API 주요 함수
함수 설명
redis.call() Redis 명령 실행, 오류 발생 시 즉시 중단
redis.pcall() 오류 발생 시 예외 대신 nil 반환
redis.sha1hex() 문자열의 SHA1 해시 계산
redis.breakpoint() 루아 디버거 중단점 설정
redis.debug() 디버거 메시지 출력
4️⃣ redis.call() vs redis.pcall()
구분 redis.call() redis.pcall()
오류 발생 시 즉시 중단 오류 내용 반환 후 계속 진행
사용 예시 트랜잭션, 필수 로직 로깅, 조건부 처리
반환값 명령 결과 성공 시 결과, 실패 시 오류 객체
예시:
EVAL "redis.call('SET',KEYS[1],ARGV[1]); redis.call('INCR',KEYS[2]);" 2 key1 key2 value1
→ key2가 숫자가 아닐 경우 redis.call()은 스크립트 중단
→ redis.pcall()은 오류를 반환하고 다음 명령으로 진행
5️⃣ 트랜잭션 (MULTI/EXEC)
기본 개념
여러 명령을 하나의 묶음으로 실행
실행 중 다른 클라이언트의 개입 없이 순차 처리
Redis의 트랜잭션은 원자성(atomicity)은 보장하지만 롤백은 없음
사용 예시
MULTI
SET foo 10
INCR foo
INCR foo
GET foo
EXEC
결과:
1) OK
2) (integer) 11
3) (integer) 12
4) "12"
트랜잭션 실패 조건
큐에 넣는 단계에서 문법 오류 발생
EXEC 실행 시 실행 오류(Out of Memory 등)
예시 2: 잘못된 명령 포함 시
MULTI
SET foo 10
NOSUCHCOMMAND foo
EXEC
(error) EXECABORT Transaction discarded because of previous errors.
⚠️ 하나라도 문법 오류가 있으면 트랜잭션 전체가 폐기됩니다.
✅ 요약
기능 목적 특징
루아 스크립트 (EVAL) 단발성 원자적 실행 서버 내 실행, EVALSHA 캐시
레디스 함수 (FUNCTION) 재사용 가능한 서버 내 함수 라이브러리로 등록, FCALL 호출
플래그 (no-writes) 읽기 전용 함수 지정 FCALL_RO로 실행 가능
redis.call / pcall 오류 처리 방식 선택 call=즉시 중단, pcall=계속 진행
트랜잭션 (MULTI/EXEC) 여러 명령 묶음 실행 원자적 실행, 롤백 없음
🔗 참고 명령 요약
명령 설명
FUNCTION LOAD REPLACE 함수 등록
FUNCTION DELETE 라이브러리 삭제
FUNCTION DUMP / RESTORE 백업 및 복원
FUNCTION STATS / LIST 상태 및 목록 조회
FCALL, FCALL_RO 함수 호출
SCRIPT KILL, SHUTDOWN NOSAVE 실행 중 스크립트 강제 종료
MULTI / EXEC 트랜잭션 시작 및 실행
🧩 마무리
Redis 7.0 이후에는 루아 스크립트보다 함수(Function) 방식이 권장됩니다.
함수를 사용하면 버전 관리, 테스트, 재사용성이 뛰어나며
FUNCTION DUMP/RESTORE를 통해 배포 자동화도 가능합니다.
트랜잭션은 단순히 명령 묶음을 원자적으로 실행할 때 유용하지만,
복잡한 조건 로직은 여전히 루아/함수 기반 원자 스크립트가 최적입니다.
🧩 3.4 모듈 (Redis Module)
🔹 개념
Redis 4.0부터 도입된 기능으로, C 언어로 작성한 확장 기능을 Redis 서버에 동적으로 추가할 수 있게 해줍니다.
즉, Redis의 코어를 수정하지 않고 새로운 명령어를 직접 추가하거나 데이터 구조를 확장할 수 있음.
🔹 역할
기존 명령으로는 불가능한 데이터 처리, 예를 들어 복잡한 통계 계산, 머신러닝용 데이터 처리 등을 수행 가능.
Redis Stack 같은 배포판은 이미 여러 모듈을 기본 탑재 (예: RedisJSON, RedisSearch 등).
🔧 3.4.1 모듈로 구현할 수 있는 것
가능 기능 설명
새로운 자료구조 추가 사용자 정의 데이터 타입을 만들 수 있음
사용자 정의 명령어 등록 RedisModule_CreateCommand() 로 새 명령어 추가
백그라운드 작업 수행 서버 내부에서 비동기로 실행 가능
고수준 API 사용 C 레벨에서 Redis와 상호작용 가능
메모리 자동 관리 Redis가 제공하는 메모리 관리 API로 효율적 자원 사용 가능
➡️ 간단히 말해, Redis 내부 로직을 C 코드로 직접 확장하는 기능입니다.
⚙️ 3.4.2 모듈 사용 예시
📘 예제: “Hello” 모듈
#include "redismodule.h"
int HelloCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
RedisModule_AutoMemory(ctx);
if (argc != 2) return RedisModule_WrongArity(ctx);
RedisModuleString *msg = RedisModule_CreateStringPrintf(ctx, "Welcome, %s!", RedisModule_StringPtrLen(argv[1], NULL));
RedisModule_ReplyWithString(ctx, msg);
return REDISMODULE_OK;
}
int RedisModule_OnLoad(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
if (RedisModule_Init(ctx, "mymodule", 1, REDISMODULE_APIVER_1) == REDISMODULE_ERR)
return REDISMODULE_ERR;
if (RedisModule_CreateCommand(ctx, "mymodule.hello", HelloCommand, "readonly", 1, 1, 1) == REDISMODULE_ERR)
return REDISMODULE_ERR;
return REDISMODULE_OK;
}
💻 실행 과정
컴파일
gcc -shared -o mymodule.so -fPIC mymodule.c
Redis 서버에 모듈 로드
MODULE LOAD /tmp/mymodule.so
명령어 실행
mymodule.hello Taro
→ "Welcome, Taro!"
모듈 해제
MODULE UNLOAD mymodule
⚖️ 3.4.3 파이프라인 / 이멀티버 / 스크립트 / 트랜잭션 / 모듈 기능 비교
| 기능 | RTT 감소 | 여러 키 동시 처리 | 원자성 | 복잡 로직 처리 | 서버 내 스크립트 실행 | 사용자 정의 명령어 |
|---|---|---|---|---|---|---|
| 파이프라인 | ⭕ | ❌ | ❌ | ❌ | ❌ | ❌ |
| 이멀티버스크립트 | ⭕ | ❌ | ❌ | ⭕ | ⭕ | ❌ |
| 트랜잭션 | ⭕ | ❌ | ⭕ | ❌ | ❌ | ❌ |
| 루아 스크립트 | ⭕ | ❌ | ⭕ | ⭕ | ⭕ | ❌ |
| 모듈 | ⭕ | ⭕ | ⭕ | ⭕ | ⭕ | ⭕ |
➡️ 즉, 모듈이 모든 기능 중 가장 강력하고 확장성 있는 방법입니다.
🔔 3.5 키 공간 알림 (Keyspace Notifications)
📌 개념
Redis 서버에서 키의 생성, 수정, 삭제 등 이벤트가 발생했을 때 알림을 제공하는 기능.
Pub/Sub 채널을 이용하여 클라이언트가 해당 이벤트를 구독할 수 있음.
🔹 사용 예시
설정 (서버 설정 or config)
notify-keyspace-events KEA
K: 키 공간 알림
E: 이벤트 알림
A: 모든 이벤트
이벤트 구독
PSUBSCRIBE key*
예시
PUBLISH keyspace@0:foo set
PUBLISH keyevent@0:set foo
→ foo 키가 변경될 때마다 알림 수신
💡 3.6 클라이언트 측 캐싱 (Client-Side Caching)
🔹 개념
Redis 6.0 이후 추가된 기능으로,
클라이언트가 Redis 데이터를 캐싱하고 서버가 키 변경 시 무효화 알림을 주는 구조입니다.
🔹 방식
CLIENT TRACKING ON 명령으로 활성화
변경된 키를 브로드캐스트(BCAST)나 특정 접두사(PREFIX)로 감시 가능
내부적으로 RESP3 프로토콜 기반
🔹 장점
네트워크 요청 횟수(RTT)를 줄이고,
자주 조회하는 키는 로컬 클라이언트 캐시에 저장하여 속도 향상
Redis 서버 부하를 감소시킴
📚 핵심 요약
구분 핵심 기능 특징
모듈 Redis 기능 확장 (C 언어로 작성) 사용자 정의 명령어 / 자료구조 가능
루아 스크립트 서버 내부에서 로직 실행 트랜잭션 + 조건문 가능
트랜잭션 여러 명령 원자적 실행 실패 시 전체 롤백 불가
키 공간 알림 키 이벤트 발생시 알림 Pub/Sub 기반
클라이언트 캐싱 클라이언트 측 데이터 캐시 Redis 6.0 이상, 효율적 캐시 관리