REDIS(REmote DIctionary Server)의 약자로 인 메모리 기반의 key-value 구조 데이터 관리 시스템이다. 모든 데이터를 메모리에 저장하므로 빠른 Read & Write 속도를 보장하는 NoSQL 데이터베이스이다.
요즘 회사들은 자체 RBDMS의 부하를 줄이기 위해 redis 클러스터를 주로 사용해 운영한다.
공식 문서에 의하면 redis는 다음과 같은 데이터타입을 지원한다
redis에서는 데이터를 저장하는 방식이 2가지가 있다
스냅샷 : 순간적으로 메모리에 있는 내용을 DISK 전체에 옮겨 담는 방식이다. 순간적으로 모든 redis의 동작을 정지시키고 그때의 스냅샷을 저장하는 SAVE
방식과 별도의 process를 띄운 후 정지동작 없이 스냅샷을 저장시키는 BIGSAVE
방식이 있다.
AOF (Append On File) : redis의 모든 write/update 연산 자체를 모두 로그 파일에 기록해두는 방식이다. redis 서버가 재시작될때 기록된 모든 연산을 순차적으로 실행하여 데이터를 복구한다. 스냅샷 방식과는 달리 특정 시점이 아니라 항상 현재 시점까지의 로그를 기록할수 있다는 장점이 있다.
일반적으로 위 두가지 방식을 혼용해서 사용하는 것이 바람직하다고 한다.
$ brew install redis
$ redis-server --daemonize yes
$ redis-cli ping
PONG
간단한 파이썬 코드를 사용해 redis queue를 구현해보자. redis queue에는 데이터를 write하는 enqueue()
메소드와 데이터를 read하는 dequeue()
메소드가 있다.
redis.py
class RedisQueue():
def __init__(self):
self.redis = redis.StrictRedis(
host="localhost",
port=6379
)
logger.info("redis_initialization")
def enqueue(self, key, value):
self.redis.rpush(key, value)
def dequeue(self, key):
return self.redis.lpop(key)
redis 커넥션을 잡을 때 포트 번호는 전용 포트인 6379를 잡아준다.
간단하게 key, value 페어로 redis에 데이터를 넣어주는 코드를 짜봤다.
view.py
import logging
import json
from rest_framework.decorators import api_view
from rest_framework.response import Response
from rest_framework.status import HTTP_200_OK
from .redis import RedisQueue
logger = logging.getLogger(__name__)
@api_view(['POST'])
def post_data(request):
try:
# args (key, value)
data = json.loads(request.body)
redis = RedisQueue()
redis.enqueue(data['key'], data['value'])
return Response(status=HTTP_200_OK)
except Exception as e:
return Response({"message": str(e)}, status=400)
그리고 실제로 API를 호출해 데이터를 날려보면
이런식으로 redis DB에 저장된다.