Redis

Sung Jun Jin·2020년 8월 30일
1

TIL

목록 보기
25/25
post-custom-banner

Redis란?

REDIS(REmote DIctionary Server)의 약자로 인 메모리 기반의 key-value 구조 데이터 관리 시스템이다. 모든 데이터를 메모리에 저장하므로 빠른 Read & Write 속도를 보장하는 NoSQL 데이터베이스이다.

요즘 회사들은 자체 RBDMS의 부하를 줄이기 위해 redis 클러스터를 주로 사용해 운영한다.

Redis Data Type

공식 문서에 의하면 redis는 다음과 같은 데이터타입을 지원한다

  • String
  • List
  • Sorted sets
  • Bitmaps & HyperLogs
  • Hashes

Persistence

redis에서는 데이터를 저장하는 방식이 2가지가 있다

  • 스냅샷 : 순간적으로 메모리에 있는 내용을 DISK 전체에 옮겨 담는 방식이다. 순간적으로 모든 redis의 동작을 정지시키고 그때의 스냅샷을 저장하는 SAVE 방식과 별도의 process를 띄운 후 정지동작 없이 스냅샷을 저장시키는 BIGSAVE 방식이 있다.

  • AOF (Append On File) : redis의 모든 write/update 연산 자체를 모두 로그 파일에 기록해두는 방식이다. redis 서버가 재시작될때 기록된 모든 연산을 순차적으로 실행하여 데이터를 복구한다. 스냅샷 방식과는 달리 특정 시점이 아니라 항상 현재 시점까지의 로그를 기록할수 있다는 장점이 있다.

일반적으로 위 두가지 방식을 혼용해서 사용하는 것이 바람직하다고 한다.

간단한 예제

1. redis 설치

$ brew install redis

2. redis 데몬으로 서버 구동

$ redis-server --daemonize yes

3. redis-cli 서버 상태 확인

$ 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에 저장된다.

profile
주니어 개발쟈🤦‍♂️
post-custom-banner

0개의 댓글