디디의 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
- 메모리 파편화