백엔드 Back-end/패스트API FastAPI

Q. API 서버에서 인메모리 데이터베이스를 캐시cache로 쓰면 얼마나 빨라질까?

Tap to restart 2022. 4. 12. 00:00
반응형

A. 응답을 받는데 1초가 걸리던 엔드포인트가 있다면, 100배 넘게 빨라질 수 있다!

 

처음에 1초 걸리던 게, 그 다음에는 0.0003초 걸렸다. 3000배 이상 빨라진 것이다. 

컴퓨터 성능에 따라 다르지만 보통 100배 이상 빨라질 수 있다.

 

위 캡쳐화면을 통해서 왜 인메모리 데이터베이스를 캐시로 써야 하는지 쉽게 이해할 수 있다. 

캐시를 쓰는 것만으로도 성능을 엄청나게 빠르게 할 수 있으니, 당연히 써야 한다.

 

구현 방법

구현 방법은 간단하다. 

redis 같은 메모리 데이터베이스에 endpoint와 파라미터 전체 url을 키로 넣고, 응답을 값으로 해서 저장하는 식이다. 

그럼 완전히 동일한 endpoint와 파라미터로 다시 요청이 왔을 때 메모리 상에 저장해둔 응답을 바로 보내주면 아주 빨리 처리할 수 있다.

 

당연히 expire 만료 기간을 설정해두면 된다. 만료 기간이 지나면 메모리 상에서 날라가고, 다시 좀 오래 걸리게 처리하면 된다. 실제 오픈소스 redis cache 이런 식으로 검색해서 코드를 살펴보면 위 내용대로 구현 되어 있는 것을 확인할 수 있다.

 

구현 예

FastAPI로 간단한 예제 코드를 만들어 보면 아래와 같다. 

실제 cache 오픈 소스 코드를 살펴보면 큰 차이는 없다. 

간단히 예제로 그냥 endpoint만 키로 저장했고, 일부러 오래 걸리게 만들기 위해서 time.sleep을 1초 걸었다.

import datetime
import time

from fastapi import FastAPI
import redis
import json

app = FastAPI()
r = redis.Redis(host='localhost', port=6379, db=0)


def get_response(endpoint):
    message = {"message": "Hello World"}
    if r.get(endpoint) is None:
        time.sleep(1)
        r.set(name=endpoint, value=json.dumps(message), ex=datetime.timedelta(seconds=30))
        response = message
    else:
        message = r.get(endpoint).decode('utf-8')
        response = json.loads(message)
    return response


@app.get("/")
async def root():
    endpoint = '/'
    start_time = time.time()
    response = get_response(endpoint)
    process_time = time.time() - start_time
    print(f'process_time: {process_time}')
    return response

 

전체 코드: FastAPI - Cache with Redis

 

반응형