-내용 출처 : 우아한 Tech 채널 (디디의 Redis)
- Redis
- Remote Dictonary Server
- 원격의 Key,Value 구조 서버로 해석할 수 있다.
- Cache
- 나중의 요청에 대한 결과를 미리 저장했다가 빠르게 사용하는 것
- 어디에 ? 메모리 구조를 먼저 살펴보자.
- 메모리구조
- Storage (SSD, HDD) -> Main Memory (DRAM) -> CPU Cache -> CPU Register
- -> 이 순으로 속도가 빠르고, 비싸다.
- 맥북을 예로 들면?
- i7 CPU - 12 MB Cache Memory / 16GB DRAM / 512GB SSD
- 12MB Cache Memory (SRAM) : 엄청 빠르고, 비싼데 용량이 작음->데이터베이스로 사용하기엔 작음
- 16GB DRAM : 적당히 빠르고, 비싸고, 크고 휘발성임 -> 휘발성이라는 것은 컴퓨터가 꺼지면 데이터가 전부 날라가게 됨
- 512GB SSD : 비교적 느리고, 저렴하고, 용량이 엄청큼, 그리고 비휘발성!
- i7 CPU - 12 MB Cache Memory / 16GB DRAM / 512GB SSD
- 데이터베이스는 컴퓨터가 꺼져도 데이터를 유지해야 하기 때문에 SSD에 기본적으로 저장함
- 하지만 기술이 발달하고, 하드웨어가 커지다 보니 메인메모리에 저장해서 좀 더 빠르고 쉽게 데이터에 접근하면 어떨까? 하는 접근방식으로 나온 것이 Redis
- Storage (SSD, HDD) -> Main Memory (DRAM) -> CPU Cache -> CPU Register
Database보다 더 빠른 Memory에 더 자주 접근하고 덜 자주 바뀌는 데이터를 저장하자
In-memory Database Redis (Cache)
- Data Structure
- Collection을 지원함 (Memcached와 다른 점)
- 자바를 예로 들면 아래와 같은 자료구조를 제공한다.
- Map.Entry
- LinkedList
- HashSet
- TreeSet
- HashMap
- 어디에서 쓰나요?
- 여러 서버에서 같은 데이터를 공유할 때
- 주의해야 할 점
- Single Thread 서버 이므로 시간 복잡도를 고려해야 한다.
- Redis는 기본적으로 Single Threaded를 활용함, 이를 통해 여러 개의 Thread가 경합하는 Race Condition을 피하려고 했음 (이 외에도 여러 방법을 통해 Race Condition을 방지하려 함)
- 네트워크로 부터 요청을 받아서 처리를 할 때 Command가 오랜 시간이 걸리는 경우 나머지 요청들이 더 이상 받아지지 않고 서버가 다운되는 문제가 발생될 수 있음
- O(N)의 명령어 같은 경우는 지양해야 한다. (싱글쓰레드기 때문에 처리가 그만큼 빨라야 한다)
- 예를 들면 모든 Key들을 가져오는 명령어, Flush(), GetAll() 같은 것
- In-memory 특성상 메모리 파편화, 가상 메모리 등의 이해가 필요
- Single Thread 서버 이므로 시간 복잡도를 고려해야 한다.
- 메모리 관리
- 메모리 파편화
- 가상메모리 Swap
- Replication - Fork
- 메모리 데이터 저장소이기 때문에 데이터 유실될 문제를 안고 있음
- 복사 기능을 제공해주기 때문에 slave redis server 혹은 디스크에 데이터를 복사 저장함
- 복사를 할 때 프로세스를 그대로 복사해서 사용하는 과정을 거치는데 만약 메모리가 꽉 차 있다면 복사가 잘 안되어 서버가 죽는 경우가 생길 수 있기 때문에 메모리를 여유있게 사용해야 함
'TIL (Today I Learned)' 카테고리의 다른 글
소스 분석 01 (0) | 2022.06.23 |
---|---|
Kafka 뿌셔 (기본 구조, 프로듀서, 컨슈머, RabbitMQ 비교) (1) | 2022.06.15 |
Docker mac에 설치해서 컨테이너 실행해보기 / Docker 문법 (0) | 2021.08.04 |
Docker 도커가 대체 뭐야 ㅠㅠ (0) | 2021.08.03 |
BigQuery - Cloud SQL , CSV 파일 (0) | 2019.10.18 |