DataBase/redis
Redis의 ACID 특성과 Lua Script
허 진
2025. 2. 9. 20:53
⚾ Redis의 ACID 특성
👉 Atomicity (원자성)
- Redis 트랜잭션은 흔히 우리에게 익숙한 방식인 "all or nothing" 방식으로 실행됨
- MULTI/EXEC 블록 내의 모든 명령어가 성공적으로 실행되거나, 아예 실행되지 않음
- MULTI/EXEC 블록은 Redis에서 여러 명령어를 하나의 그룹으로 묶어서 실행하는 방식
- (Redis에서 제공하는 트랜잭션 기능)
- 시스템 오류나 충돌이 발생해도 부분적 실행은 없음
👉 Consistency (일관성)
- Redis는 단일 스레드 모델을 사용해 일관성을 보장
- Mysql의 경우 멀티스레드로, 여러 명령어 동시 처리 가능
- but 동시성 제어가 필요(lock 이나 트랜잭션)
- (Redis가 단일 스레드 모델인 이유는 메모리 기반이라 매우 빨라 충반한 성능이 가능하다고 하네요)
- 모든 데이터 구조는 유효한 상태를 유지
- 명령어 실행 전후로 데이터베이스는 항상 일관된 상태를 유지
👉 Isolation (격리성)
- Redis는 트랜잭션을 순차적으로 실행
- 트랜잭션 실행 중에는 다른 클라이언트의 명령어가 끼어들 수 없음
- WATCH 명령어를 통해 낙관적 잠금(Optimistic Locking) 구현 가능
- 단일 스레드임에도 Watch 가 필요한 이유
- "Check and Set" 이라는 작업 때문
- 즉 클라이언트가 값을 읽고 수정하는 사이에 다른 클라이언트의 변경이 있었는 지 확인하기 위해 필요
👉 Durability (지속성)
- AOF(Append Only File)와 RDB 스냅샷을 통해 지속성 보장
- fsync 정책을 통해 디스크 동기화 수준 조절 가능
- fsync는 데이터를 메모리에서 디스크로 실제로 쓰는 시점을 결정하는 정책
- 메모리와 디스크 동기화 전략 선택 가능
👂 AOF (Append Only File) 와 RDB(Redis Data Base)
- AOF : 모든 쓰기 명령어를 파일에 순차적으로 기록
- RDB : 특정 시점의 전체 데이터를 스냅샷으로 저장
- 두 방식을 함께 사용하여 데이터 안정성을 높임임
⚾ Lua 스크립트
👉 기본 개념
- Lua는 간단하고 가벼운 프로그래밍 언어
- Redis에서 복잡한 작업을 원자적으로 실행할 수 있게 해주는 기능
- MySQL의 SQL과 유사한 역할을 하지만, 더 풍부한 프로그래밍 기능 제공
- Redis에서 복잡한 작업을 안전하게 처리할 수 있게 해주는 도구
👉 사용 목적
- 여러 명령어의 원자적 실행
- 복잡한 비즈니스 로직 구현
👉 주요 특징
- 원자성 보장: 스크립트 전체가 하나의 작업으로 실행
- 성능 최적화: 여러 명령어를 한 번의 네트워크 왕복으로 실행
- 프로그래밍 기능: 조건문, 반복문 등 사용 가능
⚾ SQL과의 비교
👉 공통점
특징 | 설명 |
---|---|
일괄 실행 | 여러 작업을 한번에 실행 가능 |
안전성 | 트랜잭션처럼 안전하게 처리 |
실행 위치 | 서버 쪽에서 실행되는 로직 |
👉 차이점
SQL | Lua Script |
---|---|
관계형 DB 전용 언어 | 범용 프로그래밍 언어 |
제한된 문법 | 자유로운 프로그래밍 가능 |
쿼리 중심 | 로직 중심 |
👍 정리
- Redis의 ACID 특성과 Lua 스크립트는 상호 보완적인 관계를 가지며, 복잡한 비즈니스 로직을 안전하고 효율적으로 처리할 수 있게 해줍니다.