본문 바로가기
WEB

[Redis] Redis란?

by BK0625 2023. 9. 11.
반응형

 

인메모리 데이터 구조 저장소 Redis

 

 

그 동안 프로젝트에 redis를 붙여봐야지 하고 한참을 미루다가 붙이기 전에 글로 정리하고자 쓰는 포스팅...

 

Redis는 Key,Value 구조의 비정형 데이터를 저장하고 관리하기 위한 오픈 소스 기반의 비관계형 데이터베이스 관리 시스템이다. 전체 데이터를 영구히 저장하기 보다는 캐쉬처럼 휘발성이나 임시성 데이터를 저장하는데 많이 사용된다. 디스크에 데이터를 주기적으로 저장하기는 하지만, 이 기능은 백업이나 복구용으로 주로 사용하고 데이터는 모두 메모리에 저장되기 때문에, 빠른 접근 속도를 자랑한다.

 

 

그렇다면 데이터를 저장하는 데이터 베이스가 있는데 왜 Redis라는 인메모리 데이터 구조 저장소를 사용하는 이유는 무엇일까? 일단 데이터베이스는 데이터를 직접 물리 디스크에 쓰기 때문에 서버에 문제가 발생해도 데이터가 손실되지는 않는다. 다만 데이터를 얻기 위해서 매번 디스크에 접근해야 하기 때문에 사용자가 많아질수록 부하가 많아져 느려질 수 있다.

 

 

초창기 서비스이거나 규모가 작으면 WEB - WAS - DB 구조로도 크게 문제가 없지만 사용자가 늘어나 처리해야될 요청이 많아지고 데이터베이스에 데이터가 쌓이게 되면 데이터 베이스가 과부하 될 수 있기 때문에 이 때 캐시 서버를 도입하여 사용한다. 그리고 Redis가 이 캐시 서버로 활용할 수 있다.

 

 

그렇다면 캐시(Cache)란?

간단하게 캐시란 자주 사용하는 데이터나 값을 미리 복사해 놓는 임시 장소를 가리킨다. 

 

 

 

위 사진에서 보다시피 캐시는 저장 공간이 작고 비용이 비싼 대신 빠른 성능을 제공한다. 캐시는 접근 시간에 비해 원래 데이터를 접근하는 시간이 오래 걸리는 경우나 반복적으로 동일한 결과를 돌려주는 경우(이미지나 썸네일 등)에 사용을 고려하면 좋다. 즉 물리 디스크가 아닌 메모리에 데이터를 저장하였다가 불러다 쓰는 것이기 때문에 DBMS의 부하를 줄이고 성능을 높일 수 있다.

 

원하는 데이터가 캐시에 존재할 경우 해당 데이터를 반환하며 이러한상황을 Cache Hit라고 하며 반대로 데이터가 캐시에 존재하지 않을 때엔 DB에 요청해야 하며 이를 Cache Miss라고 한다.

 

캐시도 패턴이 있는데 그건 추후 Redis를 적용하는 포스팅에 추가하도록 하겠다.

 

다시 Redis로 돌아와서 간단하게 Key-Value 형태의 데이터 저장 뿐만 아니라 다양한 데이터 타입을 지원하기 때문에 응용도가 높고, NodeJS 호환 모듈이 잘 지원되어 궁합이 좋다.

 

 

 

자료구조

Redis의 가장 기본이 되는 자료구조를 살펴보자

 

- String

Key에 대해서 문자열을 저장한다. 텍스트 문자열 뿐만 아니라 숫자나 최대 512MB까지의 바이너리도 저장할 수 있다.

 

- List

Key에 대해서 List 타입을 저장한다. List에는 값들이 들어갈 수 있으며, INDEX 값을 이용해서 지정된 위치의 값을 넣거나 뺄 수 있고 push/pop 함수를 이용하여 리스트 앞뒤에 데이터를 넣거나 뺄 수 있다. Linked List와 같은 자료구조라고 할 수 있다.

 

- Sets

Set 자료 구조는 집학이라고 생각하면 된다. key에 대해 Set을 저장할 수 있는데 List와 다른 점은 집합이기 때문에 같은 값이 들어갈 수 없다. 대신 집합의 특성을 이용한 집합 연산, 교집합, 합집합 등의 연산이 가능하다.

 

- Hashes

해쉬 자료 구조를 생각하면 된다. keyd에 해쉬 테이블을 저장하는데, 해쉬 테이블에 저장되는 데이터는 (field, value) 형태로 field를 해쉬의 키로 저장한다. 키가 있는 데이터를 군집하여 저장하는데 유용하고 데이터의 접근이 빠르다.

 

https://bcho.tistory.com/1098

 

 

Redis의 특징 및 주의할 점

Redis는 싱글 스레드이다. 한번에 하나의 명령만 처리할 수 있다. 그렇기 때문에 중간에 처리 시간이 긴 명령어가 들어오면 그 뒤에 명령어들은 모두 앞에 있는 명령어가 처리될 때까지 대기가 필요하다. (다만 get,set 명령어의 경우 초당 10만 개 이상 처리할 수 있을만큼 빠르다.)

 

주의할 점으로는 

 

서버에 장애가 발생할 경우 그에 대한 운영 플랜이 필요하다. 인메모리 데이터 저장소의 특성상, 서버에 장애가 발생했을 경우 데이터 유실이 발생할 수 있기 때문이다. 그리고 당연하게도 메모리 관리가 중요하다. 마지막으로 싱글 스레드의 특성 상 한번에 하나의 명령만 처리할 수 있기 때문에 처리하는데 시간이 오래 걸리는 요청, 명령은 피해야 한다.

 

 

이렇게 Redis의 기본 개념을 정리해보았다.

 

다음 포스팅은 현재 프로젝트에 Redis를 직접 적용해보며 해당 부분에 추가 포스팅을 할 예정이다.

 

 

공부하면서 정리한 내용입니다. 모든 지적 감사히 받겠습니다:) 

 

반응형

'WEB' 카테고리의 다른 글

[WEB] JWT 알아보기 (Json Web Token)  (0) 2023.09.14
[WEB] 웹서버와 WAS의 차이  (0) 2023.07.19
[WEB] URL과 URI의 차이  (0) 2023.07.13
HTTP와 HTTPS, SSL  (0) 2023.01.19