MQ

[Redis] Redis란?

jolocal 2024. 3. 6. 15:15
728x90

1. Redis란?


Remote Dictionary Server

 

 

in-memory, key-value 데이터 저장소를 지원하는 오픈 소스 데이터베이스 입니다.

Dictionary 라는 이름을 자료구조로 바라보면 특히 자바에서 Hash Table이라고 말할 수 있습니다. 이를 통해서 key-value 데이터를 저장하고 다룬다는것을 유추할 수 있습니다.

오픈 소스 이기때문에 깃허브, 레포지토리를 통해 내부 구현이 어떻게 되어있는지 직접 확인해 볼 수 있고 빠른 속도와 이식성에 강점이 있는 C언어로 구현이 되어 있습니다.

 

2. Redis특징


in-memory database

Redis는 지난 포스팅에서 다룬 in-memory database 특징을 가지고 있습니다. 빠른 응답속도를 위해서 디스크가 아닌 메모리에 데이터를 적재하고 활용합니다.

 

하지만 일반적으로 메모리는 디스크보다 비싸고 디스크만큼 많은 데이터를 저장하기에 용이하지 않습니다.

예를들어, 메모리로 1일 100G 이상의 데이터를 저장할 수 있을까요? 한달만 누적되어도 3TB 메모리가 필요할텐데 이를 하드웨어적 시스템으로 준비하는것도 만만치 않을것이고 비용 또한 디스크 대비 엄청나게 차이가 날것입니다. 이러한 단점을 극복할 만큼 빠른 데이터 처리속도가 있기 때문에 이를 활용하게 됩니다.

 

Persistent on Disk

 Redis의 대표 특징으로서 메모리에 있는 데이터를 디스크에 저장하여 운용할 수 있습니다.

가용성이나 백업을 위한 조취로 볼 수 있습니다.

Redis는 RDB(Snapshot)와 AOF(Append Only File) 두가지 형식을 지원하고 있습니다.

 

  •  RDB(Snapshot)

RDB는 Redis DataBase의 약자로서 특정 시점에 전체 DB를 디스크에 저장하는 방식을 말합니다. 일종의 데이터베이스 백업 방식을 생각하면 됩니다. 예를 들어 한시간 단위로, 일일단위로 전체 백업을 하는 전략을 말합니다. 추후 문제가 발생하면 백업된 데이터를 복구할 수 있지만 실행 주기가 길기때문에 그 사이에 문제가 되면 그 시간만큼 추가 또는 변경된 내용은 유실되게 됩니다.

또한 Snapshot 과정 자체가 프로세스 포크 기반으로 진행되기 때문에 갑자기 메모리 사용량이 급증할 수 있어 모니터링이 반드시 필요합니다.

 

  •  AOF(Append Only File) 

AOF는 Append Only File의 약자입니다. 데이터 쓰기 작업 명령어들을 적재하는 방식을 말합니다. 일종의 히스토리를 쌓게 되는것인데 앞서 말한 특정 시기의 데이터를 백업하는 RDB보다는 좀 더 복구에 용이하다는 장점이 있습니다.하지만 그만큼 데이터 용량을 더 많이 활용하게 되고 디스크의 쓰기 작업이 빈번하게 발생하기 때문에 성능에 영향을 미칩니다.

 

 

앞서 말한 RDB와 AOF를 둘 중 한가지만 사용하거나 둘다 설정하여 활용하는것도 가능합니다.

기본 설정으로는 RDB만 활성화 되어있고, 단순 캐쉬 형태로만 활용한다면 RDB와 AOF 기능을 모두 끄고 사용하는 경우도 많습니다. 하지만 중요한 데이터라고 생각한다면 RDB와 AOF 기능을 모두 켜서 이용하는것도 하나의 전략입니다.

Trade-off 있기 때문에 실무에서 어떻게 활용하냐에 따라 Persistent 설정 여부는 충분히 달라질 수 있습니다.

 

Data Type

Redis의 뚜렷한 특징 중 하나는 다양한 데이터 타입을 지원하는 점입니다. Redis는 key-value 스토어여서 key에 대해서 어떤 데이터를 저장할것이냐로 접근하면 됩니다. [ String, Lists, Sets, Hashes, Sorted sets..... 

이 내용들이 저장되는 valu에 대한 데이터 타입이라고 보면 됩니다.

 

Single Thread

Redis는 클라이언트로부터 받은 데이터를 Single Thread로 처리하게 됩니다. 외부로 부터 동시에 외부 명령어를 전달받을 수 있지만 실제 처리는 순차적으로 하나씩만 진행한다는것을 의미합니다.

Single Thread 구조는 내부적으로 Rock을 사용하지 않아도 원자적 실행이 가능하게 하는데요, 이를 통해서 데이터 일관성을 보장할 수 있습니다. 왜냐하면 동시에 여러 명령어가 처리되는것이 아니라 하나씩 순차적으로 처리하기 때문입니다.

 

예를들어 여러 applicaion에서 redis로 4개의 명령을 요청하는 상황을 가정해보겠습니다.

 

요청 순서상 4번,2번,3번,1번 요청이 Redis 서버에 도착했다면 Redis에서는 Single Thread에 전달받은 순서대로 명령을 처리하게 되는데요 아주 짧은 찰나라도 들어온 순서대로 실행하게 됩니다.

 

 

4번,2번,3번,1번 순으로 명령을 처리하는거죠.그리고 그에 맞게 순서대로 응답을 주게 됩니다. 즉 단일 처리가 주는 이점으로 병렬 처리보다 복잡성을 줄일 수 있고 단순함을 유지할 수 있는 장점이 있습니다.

Redis는 Single Thread 구조 임에도 불구하고 일반적으로 초당 10만건 까지 지연없이 처리가 가능하다고 알려져있습니다.

 

하지만 Single Thread이기 때문에 앞서 내린 명령들이 많은 시간이 소요되면 뒤에 명령들은 처리되지않고 대기하게 됩니다.이렇게 되면 명령에 대한 응답속도 지연으로 이어지게 되는데 이게 때때로 서비스 장애까지 이어지는 요인이 되기 때문에 반드시 알고 있어야 할 주의점입니다.

 

Thread I/O

Redis 6.0 이상 부터는 성능 향상을 위해 Thread I/O가도입이 되었습니다. I/O 부분에 별도의 다수의 Thread를 설정해서 사용하는 것인데요, 대표적으로 네트워크 in/out에 사용되고 병렬처리 또한 가능해졌습니다.

그래도 기존 구조와 같이 실제 동작, 명령어를 처리하는 부분은 Single Thread로 여전히 동작합니다. 기존에 Single Thread 명령 처리 부분에서 i/o로 명령 지연이 일어나지 않도록 기능이 개선되었다고 생각하시면 됩니다.

 

 

Redis 활용 사례


1. cache

자주 사용하는 잘 변하지 않는 데이터를 Redis에 적재하여 이를 활용할 수 있습니다. 반복적인 지리를 줄임으로서 database 리소스를 줄일 수 있고 서비스의 낮은 응답속도 또한 줄일 수 있습니다.

 

2.Session Store

웹애플리케이션에 세션 정보 저장이 필요할때 분산 저장소로서 Redis가 활용할 수 있습니다. Redis에서는 TTL이라는 데이터 자동 삭제 기능을 제공하고 있는데요 특정 시간 이후에 자동적으로 데이터를 삭제되는것을 말합니다. 이러한 기능을 활용해서 오래된 세션 데이터를 삭제하고 관리하는데에 유용합니다.

 

3. Pub/Sub

Publish / Subscribe 를 줄여서 말하는것을 뜻합니다. Redis는 메세지 브로커로서 메세지 발행인 Publish 구독인 Subscribe를 통해서 클라이언트가 메세지를 주고받을 수 있는 기능을 제공합니다.

그림에서 1번 메세지를 Redis로 서버가 전달을 하고 Redis는 subscribe 하고 있는 오른쪽 두개의 서버에 동일한 1번 메세지를 전달해주는 구조를 가지게 됩니다. 웹애플리케이션은 이 기능을 통해 비동기 처리 목적으로 활용할 수 있고 실시간 채팅과 같이 메세지 중계를 위한 기능으로서도 활용이 됩니다.

 

4. Message Queue

메세지를 Redis에 저장하고 해당 메세지를 필요로하는 서버에서 데이터를 요청한 순서대로 메세지를 가져가 처리할 수 있는 구조로 활용됩니다. 

그림의 예시를 보면 왼쪽 서버에서 1번과 2번 메세지를 Redis로 저장을 하게 되고, 오른쪽 위에 있는 서버가 메세지를 먼저 요청한 후 그 밑에 있는 서버가 요청을 한 상황이라고 가정을 한다면 먼저 요청한 위에 서버가 1번 메세지를 가져가게 되고 그 다음 요청한 2번 메세지를 가지고 가는 구조가 됩니다.

 

5. Geospatial

지리 공간 데이터를 Redis에 적재하고 쿼리하는데에도 활용할 수 있습니다. 즉 위도 경도 정보를 Redis에 저장하게 되는데요 현재 내 위치로부터 반경 몇 km 까지 데이터가 있는지 이런것들을 지리하고 정보를 얻어내는데에 유용하게 활용할 수 있습니다.

 

6.leader board

leader board는 사용자들간 경쟁할 수 있는 점수 체계를 말하며 순위대로 표시할 수 있는 시스템을 말합니다. Redis에는 Sorted Set 데이터 타입을 통해 elader board를 손쉽게 구현할 수 있고 순위정보를 빠르게 얻어낼 수 있습니다.

 

728x90