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.1event_product:567850List에 주문을 저장한다.ordersorderId: 101, 102, 103이런 다양한 실무 예시를 통해 Redis가 다양한 비즈니스 문제를 어떻게 해결하는지 찾아볼 수 있는 좋은 기회였다. Redis는 빠른 속도와 다양한 데이터 구조 덕분에 다양한 서비스에 유용하게 적용된다. 위와 같은 서비스를 구현할 때 나의 프로젝트에 한번 적용시켜 봐야겠다.