레디스에 대한 소개

in-memory

  • 비쌈
  • 응답속도가 빠름

key 기반 nosql

성능을 위한 캐싱

  • db 전에 캐싱으로 사용

확장성

  • 서버간 데이터공유
  • 분산 세션등

실시간 처리에 최적화 되어있음

  • 메모리
  • 여러가지 자료구조

분산락

장점

  • 빠른속도 0.1-1ms
  • 낮은 지연시간
  • 높은 처리량 (초당 수십만건) 단점
  • 휘발성
  • 가격
  • hot data만 저장

레디스와 관계형 DB

  • 저장하는 매체
  • key-value, 관계형
  • 속도, 복잡한 쿼리

Redis vs Memcached

  • Redis는 다양한 자료구조, Memcached는 스트링
  • 영속석 vs 영속성 없음
  • Memcached 멀티 스레드 지원

레디스는 캐시이상으로 조금더 다양하게 사용가능, Memcached는 완전히 캐시로만 사용

클러스터 환경 설계 기법

구성방법

  • 단일 인스턴스로 구성
    • 간단함
    • SEOF
  • 마스터, 레플리카 구조
    • 마스터는 쓰기 요청 처리
    • 레플리카는 조회 처리
    • 마스터가 다운되면?
      • 메뉴얼하게 레플리카중 하나를 마스터로 지정
  • 센티널
    • 레디스 서버와 독립적으로 수행
    • 레디스의 모든것을 모니터링
    • 클러스터에서 메뉴얼한 마스터지정을 수행
    • 3개정도의 센티넬 지정
      • 투표
      • s 다운
      • o 다운
  • 클러스터 샤딩
    • 데이터를 여러 노드에 중복

    • 마스터들이 슬롯을 나눠서 관리

      • 멀티키 명령을 처리하려면 여러개의 키가 하나의 마스터에 있어야함
        • 없으면 에러
      • 이 문제를 해결하려면 해시태그 기법을 사용
        • 키 이름에 중괄호
        • user 1000

레디스의 타입

  • 레디스는 기본적으로 String으로 사용

    • 바이트 배열
  • 레디스의 키는 스트링

  • 최대 512MB

  • Binary Safe

    • 이진 데이터
    • 직렬화된 데이터
  • 네트워크 관점에서 대역폭 사용이 있기때문에 작게 저장하는게 좋음

  • SDS (Simple Dynamic String) 구조

    • 특징
      • len: 문자열 길이
      • free:여유공간
      • buf: 문자 데이터
    • 장점
      • 길이 조회
      • 버퍼 오버플로우
      • 바이너리 세이프
      • 효율적인 Append
  • 3가지 인코딩

    • int: 해더 16, 정수값 8 = 24 바이트
    • embstr: 레디스 객체와 SDS합쳐서 20, 문자열 길이
    • raw: 레디스 객체 16, SDS 해더 8, 문자열 + 여유

명령어

  • SET, GET
    • SET
      • SET users:1000:name 김철수
      • 콜론으로 구조화
  • INCR, DECR, INCRBY, DECRBY
    • 원자적 연산
      • 즉 race condition이 없음
    • 키가 없으면 0으로 초기화 및 증가
    • *BY는 원하는 숫자만큼 증가/감소
  • MSET, MSGET
    • 여러개를 같이 사용하므로써 네트워크 RTT(Round Trip Time)감소
    • MSET 키 값 키 값
  • SET 옵션
    • SETEX: TTL 지금은 SET에서 지원
    • SETNX: 키가 없을때만 저장

키를 관리하는 여러가지 관리 기법

  • KEYS
    • 패턴에 일치하는 모든 키를 가져옴
    • 서버 블로킹, 모든 키를 순회하기 때문에 n의 복잡도
    • 프로덕션에서 사용하면 안 됨
  • SCAN
    • KEYS에 대한 대안
    • 커서기반으로 키를 검색