DB

[Redis] 레디스 기초 : 조회, 삭제, 등록, 서버 구성상태 : Master-Slave 환경에서 단일 키(Hash) 제어 및 CRUD 핵심 명령어 정리

[TIL(Today I Learned)] Redis(Remote Dictionary Server) 핵심 개념 및 구조 정리


1. Redis란 무엇인가?

Redis는 메모리 내에 데이터를 저장하는 In-Memory(인메모리) 기반의 데이터 구조 저장소입니다.

  • 초고속 성능: 디스크가 아닌 주기억장치(RAM)에 데이터를 저장하므로 초당 수십만 건의 읽기/쓰기(초고속 데이터 처리)가 가능합니다.
  • NoSQL Key-Value Store: 복잡한 테이블 구조 대신, 하나의 Key에 하나의 Value를 매핑하는 단순하고 직관적인 구조를 가집니다.
  • 다양한 데이터 타입 지원: 단순히 문자열(String)만 저장하는 일반 캐시와 달리, List, Set, Hash, Sorted Set 등 풍부한 자료구조를 기본 지원합니다.

2. 왜 사용하는가? (주요 활용 사례)

  1. 캐싱 (Caching): 데이터베이스(DB) 조회 결과를 Redis에 임시 저장해 두어, 반복되는 무거운 쿼리 요청을 빠르게 처리하고 DB 부하를 줄입니다.
  2. 세션 스토어 (Session Store): 유저의 로그인 세션 상태를 저장합니다. 서버가 여러 대(스케일 아웃) 분산되어 있어도, Redis라는 공통 저장소를 바라보게 하여 로그인 상태를 유지(Session Sharing)합니다.
  3. 실시간 순위표 (Leaderboard): Sorted Set(ZSET) 구조를 이용하면 점수에 따른 실시간 정렬 순위표를 쉽게 구현할 수 있습니다.
  4. 만료 시간(TTL) 관리: 데이터에 유효기간을 설정할 수 있어 인증번호 3분 제한, 일회성 토큰 만료 등에 유용합니다.

3. Redis의 독특한 아키텍처 특징

📌 싱글 스레드(Single-Thread) 기반

Redis는 명령어를 한 번에 하나씩만 순차적으로 처리하는 싱글 스레드로 동작합니다.

  • 장점: 멀티스레드 환경에서 발생하는 데드락(Deadlock)이나 동기화 자원 경쟁(Context Switching) 문제가 없어 개발이 단순하고 빠릅니다.
  • 단점(주의점): 만약 KEYS * 같은 무거운 명령어를 실행하면, 그 명령이 끝날 때까지 뒤에 대기 중인 모든 요청이 블로킹(대기)되어 서비스가 멈출 수 있습니다. (운영 환경에서는 SCAN이나 UNLINK 권장)

📌 데이터 영속성 (Persistence)

인메모리 특성상 서버가 꺼지면 데이터가 날아가지만, Redis는 이를 방지하기 위해 디스크 백업 기능을 제공합니다.

  • RDB (Snapshotting): 특정 시간 단위로 데이터 스냅샷을 찍어 디스크에 저장합니다.
  • AOF (Append Only File): 데이터가 변경되는 모든 명령어를 로그 파일에 실시간으로 기록하여 복구합니다.

4. 고가용성을 위한 서버 구성 방식 (Replication)

실제 실무나 엔터프라이즈 환경에서는 데이터 유실을 막고 트래픽을 분산하기 위해 서버를 여러 대 연결합니다.

  • Master – Slave(Replica) 구조:
    • Master 서버: 데이터의 쓰기(Write), 수정, 삭제(DEL, HSET)를 전담합니다.
    • Slave 서버: Master의 데이터를 실시간으로 복제(Sync)받아 들고 있으며, 오직 읽기(Read) 요청만 처리(HGETALL, EXISTS)합니다. 마스터의 부하를 낮추는 역할을 합니다.
  • Sentinel (센티넬): 마스터 서버가 다운되면 슬레이브 서버 중 하나를 자동으로 마스터로 승격(Failover)시켜 주는 감시자 시스템입니다.
  • Cluster (클러스터): 데이터를 여러 마스터 서버에 쪼개서 분산 저장(Sharding)하는 대규모 확장 구조입니다.

서버가 어떤 구조(아키텍처)로 연결되어 있는지 확인 하는 명령어

info replication

상단은 마스터 서버에서 확인한 내용이며, 아래는 슬래이브 서버 중에 하나에서 실행한 결과


4-1.데이터를 삭제해야 한다면?

Case 1. 마스터 – 복제본(Replica) 구조인 경우 ➔ 같이 지워짐 (자동 동기화)

  • 구조: 1대의 마스터(Master) 서버가 쓰기/삭제를 담당하고, 나머지 2대가 복제본(Slave/Replica)으로 연결된 구조라면 Redis Replication Docs 한쪽(마스터)에서만 삭제해도 다른 2대에서 자동으로 같이 지워집니다.
  • 주의: 반드시 마스터 서버에 접속해서 DEL을 수행해야 합니다. 만약 읽기 전용인 복제본 서버에 접속해 지우려고 하면 권한 에러(READONLY You can't write against a read only replica)가 발생하거나, 강제로 지우더라도 마스터와 데이터가 틀어지게 됩니다.

Case 2. 레디스 클러스터(Redis Cluster) 구조인 경우 ➔ 알아서 해당 서버를 찾아가 지워짐

  • 구조: 3대의 마스터 서버가 데이터를 나누어 저장하는 클러스터(Sharding) 구조인 경우입니다.
  • 결과: dev:0017이라는 키는 데이터 분산 규칙(슬롯)에 따라 3대 중 딱 1대의 서버에만 저장되어 있습니다.
  • 삭제 방법: 클러스터 모드로 접속(redis-cli -c)한 상태라면, 3대 중 아무 서버에나 들어가서 DEL dev:0017을 쳐도 레디스가 알아서 데이터가 있는 실제 서버로 명령을 토스(Redirect)하여 삭제해 줍니다.


5. 실무에서 자주 쓰는 Redis 핵심 명령어 (CRUD)

Redis는 데이터 타입(자료구조)에 따라 명령어 앞에 붙는 접두사가 다릅니다. 가장 많이 쓰이는 String(문자열) 타입과 Hash(해시) 타입을 중심으로 정리했습니다.

① String (일반 키-값) 구조

단일 키에 하나의 문자열 값을 매핑하는 가장 기본적인 구조입니다.

작업 (CRUD)명령어 형태실제 사용 예시설명
Create / UpdateSET key valueSET user:name "Alice"user:name 키에 “Alice” 저장 (기존 값 있으면 덮어씀)
ReadGET keyGET user:name키에 저장된 값을 조회 (출력: "Alice")
DeleteDEL keyDEL user:name키와 데이터를 즉시 완전 삭제
존재 확인EXISTS keyEXISTS user:name키가 있으면 1, 없으면 0 반환

② Hash (해시) 구조

하나의 키 안에 여러 개의 필드(Field)-값(Value) 쌍을 가질 수 있어, 객체(Object) 데이터를 표현할 때 주로 사용됩니다. (예: 회원 정보, 기기 정보 등)

작업 (CRUD)명령어 형태실제 사용 예시설명
Create / UpdateHSET key field value [field value ...]HSET dev:0017 status "active" ip "192.168.1.50"dev:0017 해시 키 내부에 statusip 필드/값을 한 번에 생성
Read (특정 필드)HGET key fieldHGET dev:0017 statusdev:0017에서 status 필드의 값만 조회 (출력: "active")
Read (전체 필드)HGETALL keyHGETALL dev:0017해당 해시 키 내부의 모든 필드와 값을 한눈에 조회
Delete (특정 필드)HDEL key fieldHDEL dev:0017 ip해시 내부에서 ip 필드만 쏙 골라서 삭제
Delete (해시 전체)DEL key 또는 UNLINK keyDEL dev:0017dev:0017 키에 묶인 해시 데이터 전체를 통째로 삭제

③ 데이터 만료 및 관리 명령어

Redis의 가장 강력한 장점 중 하나인 유효기간(TTL)과 관련된 필수 명령어입니다.

  • EXPIRE key seconds: 특정 키가 몇 초 뒤에 자동으로 삭제될지 유효기간을 설정합니다.bash127.0.0.1:6382> EXPIRE dev:0017 60 # (integer) 1 <- 60초 뒤 자동 삭제 설정 완료 코드를 사용할 때는 주의가 필요합니다.
  • TTL key: 키의 남은 유효시간을 초 단위로 확인합니다.
    • 양수: 남은 시간(초)
    • -1: 만료 시간 없음 (영구 저장)
    • -2: 키가 존재하지 않음 (이미 만료되어 삭제됨)
  • UNLINK key: DEL과 기능은 같지만, 데이터가 매우 클 때 Redis 서버가 멈추지 않도록 백그라운드에서 비동기로 안전하게 데이터를 지워주는 권장 명령어입니다.

한 번에 여러 필드 등록 예시

127.0.0.1:6382> HSET dev:001dsf3fsdf7 필드1 값1 필드2 값2 필드3 값3

127.0.0.1:6382> HSET dev:0017 status "active" ip "192.168.1.50" model "TX-2"
# (integer) 3  <- 3개의 필드가 새로 생성됨을 표기해줌
Hi, I’m 관리자