[Flask] Flask-Caching

Alexandria·2023년 12월 20일
0

Python3 Flask

목록 보기
12/14
post-thumbnail

1. Flask-Caching

캐싱을 구현하기 위한 패키지입니다. Flask-Caching을 사용하면 데이터나 결과를 메모리나 다양한 저장소에 캐싱하여 반복적인 계산이나 요청을 최적화할 수 있습니다. 이를 통해 성능을 향상시키고 응답 시간을 줄일 수 있습니다.

💡 본 글은 예제 코드를 이용하여 설명합니다.

2. 설정

flask/source/config.py를 살펴봅니다.

본 예제에서는 Redis를 이용하고 있으므로 캐시 데이터를 Redis와 연동하였습니다.

캐시 시간은 기본 값은 300초이며, 10초로 지정하였습니다.

class Config:
    # 코드 생략
    
    CACHE_TYPE = "RedisCache"
    CACHE_REDIS_HOST = "redis"
    CACHE_DEFAULT_TIMEOUT = 10

flask/source/my_app/__init__.py을 살펴보면 flask_caching의 Cache 객체를 생성하고 초기화합니다.

캐시를 초기화하고 싶다면 Cache 객체의 clear()를 호출하면 됩니다.

cache   = Cache()

# 코드 생략

def create_app():
    app.config.from_object(obj=config["development"])

    with app.app_context():
        # 코드 생략

        cache.init_app(app=app)
        cache.clear()

3. 캐시 적용

항상 결과 값이 같거나, 오랜 기간동안 결과가 바뀌지 않는 코드라면 캐시를 적용합니다.

flask/source/my_app/views/cache.py를 살펴보면 memoize() 데코레이터를 이용하여 피보나치 계산 결과를 캐싱하였습니다.

def fibonacci(n):
    if n <= 1:
        return n
    return fibonacci(n-1) + fibonacci(n-2)

@cache.memoize()
def cached_fibonacci(n):
    if n <= 1:
        return n
    return cached_fibonacci(n-1) + cached_fibonacci(n-2)

그리고 http://[서버]/cache를 요청하면 캐싱이 적용되지 않은 피보나치를 계산하는 데 걸리는 시간과 캐싱이 적용된 피보나치를 계산하는 데 걸리는 시간을 반환해주어 차이를 확인해 볼 수 있습니다.

@bp_cache.route(rule="/", methods=["GET"])
def main():
    start_time = time.time()
    cached_fibonacci(35)
    end_time = time.time()
    time_taken_with_cache = end_time - start_time

    start_time = time.time()
    fibonacci(35)
    end_time = time.time()
    time_taken_without_cache = end_time - start_time

    return f"캐시 미적용: {time_taken_without_cache} 초<br>캐시 적용: {time_taken_with_cache} 초"

두 번째 접속 부터 캐싱이 적용되어 훨씬 큰 차이를 확인할 수 있습니다.

💡 뷰 함수에 캐싱을 적용하고자 한다면 @cache.cached()를 사용하면 됩니다. 이때, 캐시 데코레이터는 route 데코레이터와 함수 사이에 위치하여야 합니다.

profile
IT 도서관

0개의 댓글