캐싱을 구현하기 위한 패키지입니다. Flask-Caching을 사용하면 데이터나 결과를 메모리나 다양한 저장소에 캐싱하여 반복적인 계산이나 요청을 최적화할 수 있습니다. 이를 통해 성능을 향상시키고 응답 시간을 줄일 수 있습니다.
💡 본 글은 예제 코드를 이용하여 설명합니다.
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()
항상 결과 값이 같거나, 오랜 기간동안 결과가 바뀌지 않는 코드라면 캐시를 적용합니다.
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 데코레이터와 함수 사이에 위치하여야 합니다.