CPU: 컴퓨터의 두뇌로 모든 연산을 처리한다.
Memory: 임시 저장 장치로 CPU가 빠르게 접근해야 할 데이터를 저장한다. 계산이 끝난 후 데이터를 지운다.
Disk: 영구 저장 장치로, 데이터를 오래 보관하는 역할을 한다.
처리 속도 차이!!
메모리와 디스크 간 I/O 성능은 수십에서 수천 배 차이가 난다.
Memory >>> Disk
빠르다: Disk에 비해 읽기/쓰기 속도가 매우 빠르다.
휘발성: Disk와 달리 영구적으로 데이터가 저장되지 않는다.
대표적인 캐시 시스템으로 Redis가 있다.
Redis는 메모리 기반의 데이터 저장소로 휘발성을 갖는다. 주로 데이터 접근 속도가 중요한 곳에서 활용된다.
인메모리 저장소: 메모리에 데이터를 저장해 매우 빠른 성능을 제공한다.
다양한 데이터 구조 지원: 문자열, 리스트, 해시, 집합, 정렬된 집합 등을 지원한다.
데이터 지속성 옵션: 데이터를 디스크에 저장해 영구 보관이 가능하다.
분산 시스템 지원: 클러스터와 복제로 확장성과 가용성을 높인다.
Pub/Sub 및 Lua 스크립팅 지원: 실시간 메시지 큐와 서버 측 스크립트를 제공해 다양한 서비스에 활용된다.
1. String
2. Lists
3. Sets
4. Sorted Sets
중복 없이 정렬된 집합으로 가중치를 통해 우선순위를 지정할 수 있다.
예: 랭킹 시스템 구현.
5. Hashes
6. Geospatial
Redis의 다양한 데이터 구조를 활용하면 비즈니스 로직을 단순화하고 유지보수를 용이하게 할 수 있다.
Redis는 메모리 기반이라 휘발성 문제를 가진다.
장애가 발생하면 데이터가 손실될 수 있다.
이를 해결하는 몇 가지 전략이 있다.
장점
단점
Redis의 모든 명령을 로그로 기록해 복구 시 재실행한다.
장점
단점
구조
Master Redis가 요청을 처리하고, Slave Redis에 데이터를 복제한다.
Master 장애 시 Slave가 Master로 승격되고, 복구된 Master는 다시 Slave로 전환된다.
Redis에 문제가 발생할 경우 장애를 자동으로 처리하기 위해 Redis Sentinel을 사용한다.
Sentinel의 역할
여러 Redis 인스턴스를 모니터링하고, 장애 발생 시 Failover를 수행한다.
Master에 장애가 발생한 경우 다른 Sentinel들이 Master의 상태를 확인한다.
Sentinel 시스템 예시
경기도에 있는 A 서버, 제주도에 있는 B 서버, 미국 워싱턴에 있는 C 서버에 각각 Redis를 배포해 관리한다.
개발자는 하나의 Redis처럼 사용하며, 데이터가 수정되면 나머지 인스턴스에도 자동으로 반영된다.
Redis Cluster는 여러 Sentinel과 유사한 구조로, 데이터 분산과 고가용성을 제공한다.
Hash
구조를 사용해 userId
를 키로, 상품 정보를 값으로 저장한다.user:1234:cart
{ "item1": 2, "item2": 1 }
(상품과 수량)Sorted Set
구조를 사용한다.top_selling_products
(score: 100, value: "product1")
chatroom:1234
"안녕하세요", "이번 주말에 뭐해?"
String
을 사용해 IP 주소별 호출 횟수를 저장한다.rate_limit:192.168.0.1
event_product:5678
50
List
에 주문을 저장한다.orders
orderId: 101, 102, 103
이런 다양한 실무 예시를 통해 Redis가 다양한 비즈니스 문제를 어떻게 해결하는지 찾아볼 수 있는 좋은 기회였다. Redis는 빠른 속도와 다양한 데이터 구조 덕분에 다양한 서비스에 유용하게 적용된다. 위와 같은 서비스를 구현할 때 나의 프로젝트에 한번 적용시켜 봐야겠다.