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에서 복잡한 작업을 안전하게 처리할 수 있게 해주는 도구

👉 사용 목적

  1. 여러 명령어의 원자적 실행
  2. 복잡한 비즈니스 로직 구현

👉 주요 특징

  • 원자성 보장: 스크립트 전체가 하나의 작업으로 실행
  • 성능 최적화: 여러 명령어를 한 번의 네트워크 왕복으로 실행
  • 프로그래밍 기능: 조건문, 반복문 등 사용 가능

⚾  SQL과의 비교

👉 공통점

특징 설명
일괄 실행 여러 작업을 한번에 실행 가능
안전성 트랜잭션처럼 안전하게 처리
실행 위치 서버 쪽에서 실행되는 로직

👉 차이점

SQL Lua Script
관계형 DB 전용 언어 범용 프로그래밍 언어
제한된 문법 자유로운 프로그래밍 가능
쿼리 중심 로직 중심

👍 정리

  • Redis의 ACID 특성과 Lua 스크립트는 상호 보완적인 관계를 가지며, 복잡한 비즈니스 로직을 안전하고 효율적으로 처리할 수 있게 해줍니다.