[테코톡] Redis

디디의 Redis

영상 링크: https://youtu.be/Gimv7hroM8A 테코톡 스터디: https://github.com/chance0523/Techo-Talk-Study

1. 시작하면서…

  • 회사에서 Redis를 사용하지만, 정확히 무엇인지 잘 알지 못했고, 우리 파트에서 다루지 않아서 꼭 알아둬야겠다고 생각하며 들었다.
  • ‘쿠X 주문 불가 오류… 모든 상품 품절로 표시돼’ -> 이 기사를 보면서 최근 10분만에 수천개의 에러 메시지를 받은 경험이 생각났다… 담당자는 어떤 기분이었을까 ㅠㅠ

Redis (Remote dictionary server)

  • 외부-딕셔너리-서버
  • 위 쿠팡의 에러는 Key값이 너무 많아져서 (2,147,483,647보다 많아서) 생긴 오류 (자랑라고 볼 수 있다)
  • Cache: 나중의 요청에 대한 결과를 미리 저장했다가 빠르게 사용하는 것
  • 데이터베이스보다 더 빠른 / 메모리에 더 자주 접근 / 덜 자주 바뀌는 데이터를 저장 -> 레디스

Data Structure

  • 왜 Java의 HashMap은 안 쓰는가?
    • 서버가 여러대인 경우 Consistency의 문제 발생. (세션 같은 것 쓸 때)
    • Multi-Threaded 환셩에서 Race Condition(여러개의 Thread가 경합. Context Switching에 따라 원치 않은 결과 발생)
  • Race Condition 해결
    • Redis는 기본적으로 Single Threaded
    • Redis 자료구조는 Atomic Critical Section에 대한 동기화를 제공
    • 서로 다른 Transaction Read/Write를 동기화
  • 어디서 쓰나요?
    • 여러 서버에서 같은 데이터를 공유할 때
    • Single Server라면 -> Atomic한 자료구조 & Cache
  • 주의해야할 점
    • Single Thread 서버이므로 시간 복잡도를 고려해야한다.
    • In-memory 특성상 메모리 파편화, 가상 메모리 등의 이해가 필요하다.
  • Single Thread로 사용하는 이유
    • Event Driven, IO-bound Process 등 여러 이유가 있지만 Simple.
  • Single Thread에서의 주의점
    • 빨리빨리 처리해야한다. -> O(N) 복잡도 주의!!
    • KEYS, Flush, GetAll 연산 주의!! (공홈에도 나와있음)
  • Memory 관리
    • 메모리 파편화
      • 메모리 파편화
      • 실제 사용하는 것보다 더 많은 메모리를 사용하는 것처럼 CPU가 인식 -> Process가 죽을 수도 있음.
      • 메모리 여유있게 사용해야함
    • 가상메모리 Swap
      • swap에 따른 latency 문제
    • Replication-Fork