Redis 란 ?

김용범·2024년 11월 5일

Redis(REmote DItionary Server)

Redis는 오픈 소스 기반 데이터베이스 관리 시스템(DBMS)으로, 데이터를 메모리로 불러와서 처리하는 인메모리 기반 DBMS이자 NoSQL 종류 중 하나입니다. 약 5년 전, 쿠팡에서 Redis DB로 인하여 장애가 발생한 적이 있다고 합니다. Redis에 설정한 int type의 key가 너무 많아져 int 최댓값인 2,147,483,647이 넘어가면서 발생한 이슈라고 합니다.

[ 실제 쿠팡의 Redis 코드 수정 사례 int -> long ]

Redis란 ❓

Redis는 REmote DIctionary Server의 약자로, 외부에 존재하는 딕셔너리(key-value)를 사용하는 서버를 뜻합니다. 인메모리 데이터 저장소이므로, 흔히 Disk에 저장되는 RDBMS DB보다 더욱 빠른 속도로 데이터에 접근할 수 있다는 장점이 있습니다.

메모리 계층 구조

메모리 계층 구조는 차례대로 레지스터, 캐시(SRAM), 메모리(DRAM), 디스크(Disk)로 존재합니다. 상위계층으로 갈수록 속도가 빨라지고, 가격이 비싸지지만, 용량은 작아집니다. 반대로 하위계층으로 갈수록 속도가 느려지고, 가격은 저렴해지지만, 용량은 커지는 특징이 있습니다. 흔히 RDBMS는 데이터를 디스크에 저장하므로
속도는 느리지만, 많은 양의 정보를 저장할 수 있습니다.

Redis는 위에서 말했던 것과 같이 인메모리 데이터 저장소입니다. Redis의 데이터는 메모리(DRAM)에 저장되기 때문에, RDBMS보다 더 빠른 속도로 데이터에 접근할 수 있습니다. 그런데, 여기서 의문이 생길 수 있습니다. DRAM(메모리)은 휘발성이라는 특징이 있고, 전원을 껐다가 키면 메모리가 초기화되므로 데이터가 모두 날아갈 수 있지 않을까? 라는 생각이 들 수 있습니다. 이러한 단점을 극복하기 위해서 Redis에는 AOF, RDB라는 2가지 저장 방식을 가집니다. 이 부분은 다른 글에서 찾아뵙도록 하겠습니다.

데이터 구조 및 용도

데이터 구조

Redis는 NoSQL 종류 중 하나로, key-value 딕셔너리형 데이터베이스입니다. 하나의 Key에 대해서 value로 가질 수 있는 종류는 정말 여러가지가 존재합니다. 문자열 뿐만 아니라, Hash, Set, Sorted Set 등 더 복잡하고 다양한 데이터 구조를 저장할 수 있도록 지원합니다.

용도

Redis를 사용하려고 한다면, 다음 두 가지를 생각해보면 좋습니다.

  • 요청이 자주 들어오는가 ? Yes
  • 자주 변경되는 데이터인가 ? No

즉, DB보다 더 빠른 Memory에 더 자주 접근하고, 덜 자주 바뀌는 데이터를 저장하면 인메모리 DB의 장점을 극대화할 수 있습니다. 실제로 이런 장점을 잘 이용할 수 있는 대표적인 예로 JWT 토큰 로그인 방식에서 RefreshToken 보관이 있습니다.

RefreshToken은 AccessToken보다 훨씬 긴 유효 시간을 가지므로 자주 변경되지 않습니다. 또한, 유효시간이 짧은 AccessToken이 만료될 때마다 RefreshToken 확인 요청이 들어오므로 요청 빈도수가 높습니다. 때문에 Redis를 사용해보기 아주 적당한 예시라고 생각합니다.

또한, 서버가 여러 대가 존재할 경우에 일관성의 문제를 해결할 수 있습니다. 이와 같은 개념으로 멀티 스레드 환경에서 레이스 컨디션 문제도 해결할 수 있습니다.

위 사진과 같이 여러 대의 서버가 존재할 경우, 로드 밸런서가 임의로 여러 서버로 데이터를 분배해준다고 해도 특정 서버에 종속되지 않게 하나의 레디스 세션 서버를 두고, 모든 서버가 바라볼 수 있게 한다면 데이터 일관성 문제를 쉽게 해결할 수 있습니다.

Reference

profile
꾸준함을 기록하며 성장하는 개발자입니다!

0개의 댓글