What is Redis?
Remote Dictionary Server의 줄인 말로 인 메모리형 key, value 으로 데이터를 저장하는 데이터 스토어입니다.
캐시 서버로 주로 사용되는 오픈소스이다.
※ 캐시: 데이터나 값을 미리 저장해놓고 메모리에 임시로 저장해서 호출 시 데이터를 찾는 리소스 없이 바로 가져올 수 있다.
캐시 서버를 사용하는 이유
다이나믹 프로그래밍에서 나오게 되는 중요한 핵심과 비슷한데 연산을 미리 저장해놓고 다시 호출될 때 처음부터 연산하지 않고 미리 연산된 데이터를 가져와서 이어서 연산을 시작하는 개념과 비슷하다고 볼 수 있다.
예를 들어 가게 평점을 들어보자. 배달의 민족을 보면 별점을 참여한 사람은 7000명 가까이 되는데 수천만개의 데이터에서 한 음식점에 7000개의 리뷰를 가져오게 되면 어떻게 될까?
우리가 사용하고 있는 MySql, PostgreSQL에서 매 요청 마다 이러한 연산을 하게 된다면 정말로 비효율적이고 리소스를 많이 사용하게 된다. 캐시서버는 이처럼 미리 연산된 결과를 저장해두고 요청시 연산된 결과를 반환하면서 리소스를 아끼고 효율적으로 데이터 통신할 수 있게 도와주기 때문에 사용된다.
주로 사용되는 캐시 사용 구조
Look aside cache
가장 많이 사용되는 패턴 중 하나이다.
- 클라이언트가 서버에 데이터를 요청한다.
- 서버는 캐시에 데이터가 있는지 확인한다.
- 캐시에 없는 데이터라면 데이터베이스에서 데이터를 가져 온다.
- 캐시에 없는 데이터를 저장해준다.
Write Back
데이터 베이스에서 한번에 1000개의 데이터를 넣는 것이 빠를까? 아니면 한번에 하나씩 백번 저장하는 것이 빠를까?
답은 전자가 훨씬 더 빠르다. 그렇기 때문에 캐시에 임시로 저장했다가 데이터 베이스에 사용자가 사용하지 않는 시간에
한번에 저장하는 처리를 한다.
Redis를 쓰는 이유?
Collection 제공 (Sorted Set)
랭킹 서버를 구현해야 되는 경우, 가장 쉬운 방법은 데이터 베이스에 Order By를 사용하여 정렬하는 경우 사용을 하게 된다. 하지만 데이터가 점점 쌓이게 되고 해당 데이터를 정렬해야 한다면 디스크에 직접 접근해 사용하는 디비 특성상 성능이 떨어질 수 밖에 없다.
그렇기 때문에 메모리에서 바로 가져와서 사용하는 Redis의 Collection을 사용하게 되면 되면 아주 편리하게 사용할 수 있다. 아래와 같이 저장하여 정렬된 상태의 자료구조를 지원하기 때문에 빠르게 메모리에서 데이터를 가져와서 사용자에게 보여줄 수 있다.
하지만 레디스는 휘발성 메모리이기 때문에 서버에 장애가 생기거나 너무 과도한 트래픽이 몰렸을 경우 데이터가 실종될 수 있다. 레디스는 이러한 점을 인지하고 Replication 기능을 제공을 합니다. 쉽게 설명하자면 그냥 복제라고 생각하시면 됩니다.
Replication 란 레디스의 데이터를 거의 실시간으로 다른 레디스 노드에 복사하는 작업입니다. 따라서 서비스를 제공하던 첫 번째 레디스 노드가 다운되더라도, 데이터를 받은 두 번째 레디스 노드가 서비스를 계속 할 수 있습니다. 레디스에서는 첫 번째 노드를 마스터라고 하고 두 번째 노드를 복제(replica)라고 합니다.
Collection 제공 (Key-Value)
하지만 Sorted-Set의 자료 구조를 통해 아래의 그림과 같이 더 많은 내용을 보여줘야한다고 하면 어떻게 해야될까?
데이터 베이스에 접근해서 가져와야 될까? 바로 이럴 때 필요한 자료 구조가 String, Hash같은 자료 구조를 사용한다면 해결할 수 있는 문제다.
간단한 Key-Value 사용 형태
위의 그림처럼 랭킹 정보를 가져오고 Key와 Value 형태로 저장된 데이터를 레디스에서 가져오게 된다면 데이터 베이스에 저장할 필요 없이 바로 가져올 수 있게 되는 것이다.
Atomic 한 자료 구조
여러개의 프로세가 메모리를 공유하여 잘못하여 사용하게 되면 Race Codition이 발생하게 되는데 흔히들 우리가 알고 있는 데드락도 이러한 race codtion을 통해 생기게 된다. 그렇기에 우리는 메모리를 사용할 때 자원 관리에 대해 신경을 쓰고 동시에 접근할지 않도록 방지해야한다.
하지만 레디스는 Atomic한 자료 구조를 가지고 싱글 스레드로 동작하기 때문에 race codtion을 방지할 수 있다. 하지만 그래도 잘못하면 발생가능하다. 예시로 연속 클릭을 해서 중복된 요청을 처리를 하게 되면 이와 같은 문제가 생길 수 있다.
※ race conditio: 두 개 이상의 프로세스가 공통 자원을 병행적으로(concurrently) 읽거나 쓰는 동작을 할 때, 공용 데이터에 대한 접근이 어떤 순서에 따라 이루어졌는지에 따라 그 실행 결과가 같지 않고 달라지는 상황을 말한다.
Redis 사용 사례들
- 세션 캐싱 및 토큰 저장
- 전체 페이지 캐시
- 메시지 대기열 애플리케이션
- 랭킹 보드
- 좋아요 같은 빠른 데이터 처리를 요하는 시스템
'데이터베이스 > Redis' 카테고리의 다른 글
우아한 레디스 정리(2) (0) | 2022.07.17 |
---|---|
Docker를 통한 Redis 환경 구축하기 (0) | 2022.06.06 |