1. 특징
    1. 인메모리 데이터 저장소
      1. 데이터가 메모리에 올라가 잇어서 엄청 빠름
    2. Key-Value 구조
      1. 단순히 문자열만 저장하는 게 아니라, 리스트, 해시, 집합, 정렬된 집합 같은 자료구조도 지원
    3. 싱글 스레드 기반
      1. 내부 동작은 단일 스레드라서 동시성 문제 단순, 하지만 이벤트 루프와 I/O 최적화로 빠름
    4. 캐시, 세션관리, 메시지 큐 등 다양한 용도로 사용 가능
  2. 장점
    1. 속도
      1. 메모리 기반이라 밀리초 단위 응답
      2. 다양한 자료구조 지원 → 단순 캐시 그 이상
      3. 단순한 설치와 사용 → docker run 몇 줄이면 끝
      4. 분산 처리 지원 : 클러스터링, 복제 가능
      5. Pub/Sub 기능 → 메시징 시스템으로도 활용 가능
  3. 단점
    1. 메모리 의존적 → 데이터가 커지면 비용 높아짐
    2. 데이터 유실 위험 → 설정 안 하면 재부팅 시 날아감
    3. 싱글 스레드 한게 → CPU 코어 여러 개 활용 못함
    4. 복잡한 쿼리 부족 → SQL 같은 복잡한 질의는 못함
  4. 사용 예시
    1. 웹 세션 저장
      1. 로그인 세션을 Redis에 저장해 서버 여러 대에서 공유
    2. 캐싱
      1. DB에서 자주 조회하는 값을 Redis에 넣고 빠르게 꺼냄
    3. 순위표
      1. Sorted Set 구조로 점수 높은 순 정렬
    4. 실시간 카운팅
      1. 좋아요 수, 조회수 등 카운터 관리
    5. Pub/Sub
      1. 채팅반 메시지 브로드캐스트
  5. 브로드캐스트
    1. Redis에서 말하는 건 Pub/Sub 기능을 이용해서 “한 명이 메시지를 발행하면, 그 채널을 구독한 모든 애들이 동시에 받는다는 뜻이다.”
  6. Redis에서 클러스터링 하고 복제한다는 말은 “하나의 Redis만 쓰지 않고 여러 대를 묶어서 쓰는 방법”이다
    1. 복제(Replication)
      1. 마스터 → 부하 구조
      2. 마스터 Redis에 데이터가 들어가면 부하들이 그대로 복사해서 들고 있어
      3. 장점
        1. 일기 요청을 부하로 분산시켜서 부하 줄임
        2. 마스터가 죽었을때 부하를 승격해서 서비스 계속 유지 가능
      4. 비유하면 원본 노트를 필기하는 사람이 있고, 베껴 쓰는 사람들이 동시에 따라 적는 느낌
    2. 클러스터링
      1. 데이터 자체를 여러 서버에 쪼개서 저장
      2. 하나의 Redis 인스턴스 메모리 한계를 넘기 위해 필요한 방식
      3. 예시
        1. 1억 개 키를 하나에 몰아넣으면 메모리가 꽉 차는데, 클러스터는 여러 대로 분산시켜서 저장