개발 일기

[Redis] Redis(Remote Dictionary Server) 이해하고 사용하기 본문

Computer Science/Database

[Redis] Redis(Remote Dictionary Server) 이해하고 사용하기

개발 일기장 주인 2024. 9. 22. 18:24

OAuth2.0+JWT에서 Refresh Token을 백엔드 단에서 소유하고 있기 위해 Redis에 저장했다. 그냥 다들 그렇게하니까 그렇게 처리해봤는데 정확히 알고 쓴다는 느낌이 없어서 이번 기회에 Redis에 대해 이해해보고자 한다.


 

Redis란?

  • Redis는 Remote Dictionary Server의 약자로 Key - Value  기반의 비관계형(NoSQL) 오픈소스 DBMS
  • 다양한 데이터 타입을 제공하여 다양한 기능에 활용할 수 있다. 예를 들어 sorted sets 타입을 활용한 랭킹 시스템도 구현 가능하다.

랭킹 시스템 구현

  • 별도의 SQL 쿼리문이 필요하지 않다.
  • mysql, oracle과 같이 디스크에 데이터를 저장하는 데이터베이스와 달리 redis는 주기억장치인 RAM에다가 데이터를 저장하는 인메모리(In-memory) 데이터베이스로 캐시로 사용가능하다. 덕분에 평균 작업 속도는 1ms미만이며 초당 수백만 건의 작업이 가능하다.

➜  저장, 조회 등 데이터 관련 작업이 있을때 Disk 단 까지 거치지 않고 Memory 레벨에서 처리하기 때문에 성능이 상대적으로 강점.

그렇지만 쿠팡에서 레디스로 인해 발생한 오류들도 그렇고 메모리를 사용하다보니 그만큼 처리량이 많아지면 RAM을 많이 먹어 메모리 부족 그리고 RAM의 휘발성이라는 특징으로 치명적인 문제가 발생할 수 있다.

 

동작 방식

(참고)

Redis는 기본적으로 Single Thread인줄 알고 있었는데 몇몇 블로그 를 보면 또 Multi Thread라는 말이 있다.

보면 Redis6.0부터 ThreadedIO를 지원하면서 멀티 스레드를 지원하는 것처럼 보인다.

Redis를 쓰는 사람들은 Redis에 가졌던 많은 불만 중에 하나가 왜 Multi Thread를 지원하지 않는가였으며 하지만 한편으로는 Multi Thread를 지원하면 기존의 Redis의 특징중에 하나였던 Atomic을 어떻게 보장할 것인가도 의문이였다.

ThreadedIO?

그렇다면 Single thread가 아닌데 redis의 장점이였던 Atomic을 어떻게 보장하지?라는 의문이 들 수 있다.

하지만 걱정할 필요 없다! redis는 Single thread이기 때문이다..^^

이게 무슨 말이냐면 redis는 부분적으로 Single thread와 Multi Thread를 함께 사용한다.
클라이언트로 부터 전송된 네트워크를 읽는 부분과 전송하는 부분 Multi Thread로 구현되어있으며
우리가 redis에 요청한 명령을 실행하는 부분은 Single thread로 구현되어 있다.
때문에 single thread의 장점인 Atomic한 요청 처리가 가능한 것이다.

  • I/O : 네트워크 connection
  • Event Loop : 명령 실행부분

결과적으로 명령을 실행하는 부분이 Single thread라면 성능에는 큰 영향이 없는거 아닌가?

나는 처음 이를 공부할 때 위와 같은 의문이 생겼는데 좀 더 찾아보니 그 이유를 알 수 있었다.

위와 같은 방식을 활용한다면 클라이언트가 네트워크 패킷을 여러번 보냈을 때 Redis는 각 요청의 응답을 기다리지 않고 일괄 처리하게 되는데 이는 네트워크 오버헤드를 줄이면서 시스템의 전체 처리량을 향상시킨다는 이유였다. (이러한 방식을 Pipelining이라 부르는 것 같다.)
해당 구조를 택하면서 Redis의 성능이 2배이상 좋아졌다고 한다.
아마 기존 Redis의 속도가 워낙 빠르다보니 네트워크 대기시간만 줄여도 엄청난 성능향상이 나타난 것 같다..

Redis6.0이전 -> Redis6.0이후

 

Redis의 특징 및 장점 정리

  1. 위에서도 언급했듯이 In-memory 데이터베이스로 성능에 장점이 있다.
  2. 타 In-memory 데이터베이스(Memcached)와 비교했을때 다양한 데이터 타입을 지원하기 때문에 하나의 특징이자 장점이 된다.
  3. 쿼리가 필요 없이 단순한 명령어만으로도 구현가능하며 Java, Node.js 등 다양한 언어에서 지원된다.
  4. Redis가 In-memory라는 특징으로 인해 발생할 수 있는 데이터 휘발 문제를 보완하기 위해 디스크에 백업하여 영속성을 보장한다.
  5. 싱글스레드 방식으로 동작하며 연산을 원자적으로 처리하여 Race Condition(경쟁 상태)가 거의 발생하지 않는다.

https://taes-k.github.io/2020/07/23/redis-essential/