1. Lua Script의 원자적 동작 원리
질문: Redis 싱글 스레드는 Lua Script를 어떻게 원자적으로 동작시키는가? 락을 잡는가?
답변
Redis는 락을 잡지 않는다. 대신 실행을 독점하여 원자성을 보장한다.
- 동작 원리
- Redis는 이벤트 루프 기반의 싱글 스레드 아키텍처.
- Lua Script 가 실행되면, Redis 서버는 해당 스크립트를 하나의 거대한 명령어로 취급.
- 스크립트가 시작되어 끝날 때까지 메인 스레드는 오직 이 스크립트만 처리.
- 다른 클라이언트의 요청은 전부 블로킹 대기 상태가 됨.
- 의미
- DBMS의 Row-Lock처럼 특정 데이터만 잠그는 것이 아니라, 서버 전체의 처리 권한을 독점하는 것.
- 따라서 락 경합을 관리할 필요가 없으므로 매우 빠르지만,
스크립트 실행 시간이 길어지면 전체 시스템의 응답 불가 상태를 유발할 수 있음.
2. Lua Script의 롤백과 에러 처리
질문: 실행 중 실패 시 DB 트랜잭션처럼 롤백되는가?
답변
Redis Lua Script는 엄밀한 의미의 ACID 원자성을 보장하지 않는다. Redis가 보장하는 것은 격리성이다.
- 롤백 부재
- Redis는 스크립트 실행 도중 에러가 발생하더라도, 에러 발생 이전에 수행된 쓰기 작업을 자동으로 롤백하지 않음.
- 예를 들어,
재고 차감(성공) → 스트림 발행(실패) 순서로 동작하다 멈추면, 재고는 차감된 채로 남음.
redis.pcall을 통한 수동 복구
redis.call 대신 redis.pcall을 사용하여 에러를 잡고,
명시적으로 보상 트랜잭션(ex. INCR로 재고 복구)을 코드로 작성해야 함
redis.call 를 실행한 클라이언트로 직접 반환됨.
redis.pcall 은 스크립트의 실행 컨텍스트로 반환되어 처리될 수 있음.
- 복구 실패 시
redis.pcall 내부의 복구 로직마저 실패(ex. Redis 자체가 뻗음)하면 데이터 불일치가 발생.
- 따라서 Lua Script는 "방해받지 않고 실행됨"을 보장하지만,
"오류 시 원래 상태로 복구함"을 보장하지는 않음.
3. Redis Streams의 디스크 저장 주기와 성능