ETC/Redis

[Redis] Redis란? & Redis 사용방법

seokhyun2 2021. 2. 7. 10:16

0. 개요

서비스를 개발하다보면, 서비스 속도가 종종 문제를 일으킵니다.

그래서 속도를 높이기 위해 다양한 방법을 활용하는데, 그 중에 오늘은 Redis를 활용하는 방법을 알아보고자 합니다.

 

일반적으로 데이터베이스는 저장장치에 저장이 되는데, 데이터베이스를 조회하려면 저장장치로 i/o가 발생합니다.

캐시는 in-memory 방식을 활용하여 데이터를 임시로 저장해두기 때문에 저장장치의 i/o보다 훨씬 빠르게 동작할 수 있습니다.

그래서, 자주 사용하는 데이터는 캐시 서버에서 우선 조회하고 없을 때는 데이터베이스를 다시 조회하는 방식을 활용하면 전체적인 서비스의 속도를 향상시킬 수 있습니다.

 

또, 쿼리가 길고 복잡한 경우에도 데이터베이스를 조회하는 시간이 오래 걸리는데, 이 쿼리가 자주 사용되는 경우라면 해당 쿼리가 전체 서비스 속도의 병목이 될 수도 있겠죠?

그럴때는 쿼리 결과 자체를 캐싱을 해두고, 쿼리의 결과가 바뀔 수 있는 이벤트가 발생할 때마다 캐시에 적재를 새로한다면 전체 서비스 속도를 향상 시킬 수 있을것입니다.

 

Redis는 이런 캐시 서버라고 생각하시면 됩니다.

그러면 Redis가 무엇인지 한번 알아보겠습니다.

 

1. Redis란?

Redis는 Remote Dictionary Server의 약자로서, "key-value" 구조의 비정형 데이터를 저장하고 관리하기 위한 오픈 소스 기반의 비관계형 데이터베이스 관리 시스템입니다.

 

"key-value" 데이터 베이스이므로 NoSQL이며, In-memory 기반의 데이터 처리 및 저장을 제공하여 속도가 빠르지만 서버가 꺼지면 모든 데이터가 사라진다는 단점이 있습니다.

이런 특징으로 인해서 Redis는 전체 서비스에서 속도 향상을 위한 보조 데이터베이스로 사용되는 것이 보편적입니다.

추가적인 특징으로는 데이터에 만료시간을 지정할 수 있어서 지정된 만료시간이 지나면 해당 데이터는 Redis에서 삭제되며, 만료되지 않았지만 메모리가 꽉 찼을때도 LRU(Least recently used) 알고리즘에 의해 데이터가 사라집니다.

 

그래서 Redis는 static page를 캐싱하거나 검색 또는 쿼리 결과를 캐싱하는데 주로 많이 활용됩니다. 

 

2. Redis 데이터 처리

Redis는 "key-value" 데이터 구조로 매우 간단하게 데이터를 처리할 수 있습니다.

데이터 입력/수정/삭제/조회에 대하여 아래와 같은 명령이 제공됩니다.

종류 역할
set 데이터 저장
get 저장된 데이터 조회
rename 저장된 데이터 변경
randomkey 저장된 key 중에 하나의 key를 랜덤하게 검색
keys 저장된 모든 key를 검색
exists 검색 대상 key 존재 여부 확인
mset 여러 개의 데이터 저장
mget 여러 개의 데이터 검색

JAVA에서의 Hash나, Python의 Dict와 유사하다고 생각하시면 됩니다.

 

3. Redis 사용방법

Redis를 어떻게 사용하는지, 간단하게 테스트를 해보도록 하겠습니다.

Redis 설치는 Redis 홈페이지(redis.io/)에서도 가능하지만, 더 쉽고 편하게 도커를 활용해보도록 하겠습니다.

도커가 이미 설치되어 있다면, 아래의 명령어만 입력하면 내 로컬에 Redis 서버가 실행됩니다.

docker run -p 6379:6379 redis

정말 간단하죠?

 

Redis를 사용하는 방법에는 redis-cli를 활용할수도 있지만, 실제 개발할때는 cli보다는 내가 사용하는 개발 언어에서 redis 서버를 호출할 수 있는 라이브러리를 주로 활용하므로 redis-cli는 넘어가고 python에서 redis를 사용하는 방법을 한번 알아보겠습니다.

 

redis-py 라이브러리를 설치해서 활용할 것이고, pip를 활용하여 아래 명령어로 설치해보겠습니다.

pip install redis

 

그러면 이제 파이썬에서 Redis 서버를 활용해보겠습니다.

우선 라이브러리를 임포트하고, 서버와 연결한 후 연결이 잘 되었는지 확인을 해보겠습니다.

import redis
r = redis.Redis("localhost")
print(r.ping())

이렇게 해서, True가 출력이 되면 정상적으로 Redis 서버에 연결이 된 것입니다.

 

데이터를 저장하고 조회하는 방법은 아래와 같습니다.

r.set("key1", "value1")
print(r.get("key1"))

 

 

exists를 활용하여 key가 존재하는지, 그리고 데이터 삭제도 확인해보도록하겠습니다.

print(r.exists("key1")) #1
print(r.exists("key2")) #0

print(r.delete("key2")) #0
print(r.delete("key1")) #1

위에서 key1-value1은 저장했기 때문에, key1은 존재하므로 1이 반환이 되고, key2는 존재하지 않아서 0이 반환이 됩니다.

삭제 시에는, key2가 존재하지 않는데 삭제를 하려고 했기에 0이 반환이 되고, key1은 정상적으로 삭제되어 1이 반환됩니다.

 

오늘은 Redis에 대해서 간단하게 알아보았습니다.

백엔드 서버 개발에서는 Redis는 매우 흔하게 활용되기 때문에, Redis에 대한 간단한 개요와 활용방법은 알고 있으면 좋습니다.

 

서비스가 커져서 Redis 서버도 요청이 많이 들어오면 서버 한대로는 부하가 감당이 안될 수 있습니다.

그래서 Redis에서도 이를 위해 cluster를 제공합니다.

다음에는 Redis의 cluster를 활용하여 어떻게 대규모 트래픽을 처리할 수 있는지 알아보겠습니다.