Redis란 무엇인가?

6/28/2024


Redis

레디스는 Remote Dictionary Server의 약자이다. 오픈소스로 제공되고 있어 다양한 서비스에서 사용하고 있다.

In-Memory 데이터베이스

많은 이들이 이미 알고 있겠지만 Redis는 In-Memory 데이터베이스이다. 그렇기 때문에 디스크에 I/O 작업을 하는 DB들에 비해서 빠른 속도를 자랑하고 있다. 대신 데이터가 메모리에 저장되기 때문에 서버가 종료되면 그와 동시에 모든 데이터가 사라진다 것을 잊으면 안된다.

Key - Value 구조

Redis의 속도는 단순한 구조도 한 몫 할 것이다. Redis는 간단하게 key-value로 이루어진 구조로 데이터를 저장한다. key-value 구조는 json이나 java의 map과 같이 굉장히 익숙한 구조이다. 혹자는 서버 안에서 HashMap을 써서 In-Memory로 데이터를 관리하면 되는 것 아닌가? 싶을 것이다. 물론 틀린 말은 아니다. 용도와 상황에 따라 굳이 Redis로 데이터를 관리하고 캐싱할 필요는 없을 수 있다. 하지만 분산 시스템 환경을 고려하거나 다양한 기능이 필요하다면 Redis를 사용해보는 것을 권장한다.

자료구조

Redis에서 key는 String만 지원한다. 하지만 value는 다양한 자료구조로 저장할 수 있다는 특징을 가진다. String, Bitmap, Hash, List, Set, Sorted Set 등 많은 자료구조를 지원하고 있으며, 버전이 올라가면서 점점 더 많은 자료구조들을 포용하고 있다고 한다. 이러한 덕분에 개발의 편의성과 난이도가 쉽다는 장점을 얻게 되는데, 많이 사용하는 RDBMS들의 경우 데이터를 테이블 구조로 저장하기 위해 객체를 설계하는 과정이 꽤나 머리아프기도 하다. 반면 Redis는 사용하는 객체 구조 그대로 저장할 수 있으니 비교적 고민할 거리가 없다고 볼 수 있다. (그렇다고 모든 데이터가 Redis에 저장하는 것이 좋은 것은 아니다.)

기타

이 외에도 Redis는 싱글 스레드라는 특징을 가진다. 덕분에 모든 자료가 atomic하게 관리되어 트랜잭션 문제도 해결된다. 그리고 여러가지 옵션들도 제공해주고 있는데 메모리의 휘발성을 보완하기 위한 백업 옵션, TTL 설정(수명 관리), 분산 데이터 저장소(클러스터) 구성, 각종 보안 옵션 등이 있다. 이들에 대해서는 추후에 천천히 알아가보도록 하자.

Redis 활용 케이스

그래서 그런 Redis를 어디에 어떻게 사용하는데?

Redis는 In-Memory 저장 방식, 단순한 key-value, 다양한 자료구조의 특징으로 여러 케이스에서 활용할 수 있는데, 가장 많은 활용 방법이 캐시 저장소이다.

1. 캐시 저장소

Redis를 데이터베이스와 어플리케이션 사이에서 조회 데이터를 캐싱 하는 용도로 사용할 수 있다. 어플리케이션에서 데이터베이스로 데이터를 조회하기 전, 먼저 Redis에 해당 데이터를 조회한다. 만약 데이터가 존재한다면 Redis로부터 받은 데이터를 사용자에게 제공하면 된다. Redis에 데이터가 없다면, 어플리케이션은 다시 데이터베이스에 요청하고 조회된 데이터를 사용자에게 제공함과 동시에 Redis에도 저장하여 이후 캐시로 활용하는 것이다. 이러한 사용법은 많이 알려져 있어 Spring의 경우에도 Redis와 연동하여 캐싱할 수 있는 설정을 제공해주고 있다. Redis를 캐시 저장소로 사용하는 구체적인 방법도 여러 방식이 있고 각자 장단점이 있는데, 이것들에 대해서도 추후에 천천히 알아가보도록 하자.

2. 세션 저장소

마이크로 서비스 아키텍쳐가 널리 보급되고, 이제 많은 서비스들이 분산 시스템 환경에서 제공되면서 사용자 식별 정보, 즉 세션 정보를 관리하는 것에도 많은 고민들이 생겨나게 되었다. 그러한 고민들을 해결해주는 간단한 방법으로 Redis를 많이 사용한다. 간단하게 말하자면 보통 각 서버에서 저장하는 세션 정보를 하나의 Redis에 저장하여 공유하는 방식으로 사용된다.

3. 기타 데이터

어플리케이션에서 사용하는 대부분의 데이터는 여전히 RDBMS를 통해 관리한다. 하지만 간혹, 굳이 DB의 테이블 구조로 저장할 수고를 들일 필요가 없거나 굳이 DB에 CRUD하여 리소스를 차지하지 않는 것이 나은 경우가 있을 것이다. 예를 들어 사용자가 최근에 검색한 목록을 저장하여 간단하지만 편리한 기능을 제공하겠다고 하자. 클라이언트가 아니라 서버에 저장하여 모든 디바이스에서 동일하게 적용될 수 있도록 해야한다는 요구사항이 있을 때, 굳이 단순하고 휘발성 있는 데이터를 RDBMS를 통해 관리하는 것이 불편하고 비효율적이게 느껴질 수 있다. 이럴 때 Redis에 Sorted Set 같은 자료구조로 저장한다면 훨씬 간편하고 빠르게 기능을 제공할 수 있을 것이다.

이 이외에도 Redis를 활용할 수 있는 케이스는 굉장히 많이 있고 많은 분들이 블로그 등을 통해 공유해 주시고 있다. 문제 상황을 만났을 때, Redis가 떠오른다면 한번쯤 검색하여 선구자가 있진 않을까 찾아보자.

마무리

Redis에 대해서 간략하게 알아보았다. 다음 포스트 부터는 실제로 Redis를 어떻게 사용하는지를 알아보면서 좀 더 파헤쳐 보도록 하자.

Redis

Inhyeok Kim

Email : inhyeok.kim@icloud.com

GithubPortfolio