오늘날의 디지털 세계에서는 데이트 앱을 스 와이프하거나 구매를 완료 할 때 모든 행동이 장면 뒤에서 효율적으로 작업하는 API에 대한 관계입니다. 백엔드 개발자로서, 우리는 모든 밀리 초의 계산을 알고 있습니다. 그러나 어떻게 우리는 API를 더 빨리 반응하게 할 수 있습니까? 대답은 캐싱에 있습니다.
캐싱은 메모리에 자주 액세스하는 데이터를 저장하는 기술로, 매번 느린 데이터베이스를 쿼리하는 대신 API가 즉시 응답 할 수 있습니다. 요리 할 때마다 식료품 저장실에서 가져 오는 대신 주방 조리대에 주요 성분 (소금, 후추, 기름)을 유지하는 것처럼 생각하십시오. 시간이 절약되고 프로세스를보다 효율적으로 만듭니다. 마찬가지로 캐싱은 일반적으로 요청 된 데이터를 Redis와 같이 빠르고 액세스 할 수있는 지점에 저장하여 API 응답 시간을 줄입니다.
Fastapi와 함께 Redis 캐시와 연결하려면 다음 라이브러리를 사전 설치해야합니다.
pip install fastapi uvicorn aiocache pydantic
Pydantic은 데이터베이스 테이블 및 구조를 작성하기위한 것입니다. AioCache는 캐시에서 비동기 작업을 수행합니다. Uvicorn은 실행되는 서버를 담당합니다.
이 시점에서는 Windows 시스템에서 Redis를 직접 설정하는 것이 불가능합니다. 따라서 Linux 용 Windows 서브 시스템에서 설정 및 실행해야합니다. WSL을 설치하기위한 지침은 다음과 같습니다.
게시물 설치 WSL, redis
를 설치하려면 다음 명령이 필요합니다.
sudo apt update sudo apt install redis-server sudo systemctl start redis
Redis Server 연결을 테스트하려면 다음 명령이 사용됩니다
redis-cli
이 명령 후에는 포트 6379의 가상 터미널로 들어갑니다. 해당 터미널에서는 redis 명령을 입력하고 테스트 할 수 있습니다.
사용자 정보를 검색하고 향후 요청을 위해 캐시하는 간단한 FastApi 앱을 만들어 봅시다. 캐시 된 응답을 저장하는 데 Redis를 사용합니다.
Pydantic을 사용하여 API 응답의 구조를 나타내는 사용자 모델을 정의합니다.
from pydantic import BaseModel class User(BaseModel): id: int name: str email: str age: int
각 엔드 포인트에 대한 캐싱 로직을 반복하지 않도록 AioCache 라이브러리를 사용하여 재사용 가능한 캐싱 데코레이터를 만듭니다. 이 데코레이터는 실제 기능을 호출하기 전에 Redis의 응답을 검색하려고 시도합니다.
import json from functools import wraps from aiocache import Cache from fastapi import HTTPException def cache_response(ttl: int = 60, namespace: str = "main"): """ Caching decorator for FastAPI endpoints. ttl: Time to live for the cache in seconds. namespace: Namespace for cache keys in Redis. """ def decorator(func): @wraps(func) async def wrapper(*args, **kwargs): user_id = kwargs.get('user_id') or args[0] # Assuming the user ID is the first argument cache_key = f"{namespace}:user:{user_id}" cache = Cache.REDIS(endpoint="localhost", port=6379, namespace=namespace) # Try to retrieve data from cache cached_value = await cache.get(cache_key) if cached_value: return json.loads(cached_value) # Return cached data # Call the actual function if cache is not hit response = await func(*args, **kwargs) try: # Store the response in Redis with a TTL await cache.set(cache_key, json.dumps(response), ttl=ttl) except Exception as e: raise HTTPException(status_code=500, detail=f"Error caching data: {e}") return response return wrapper return decorator
이제 사용자 ID를 기반으로 사용자 정보를 검색하는 FastApi 경로를 구현합니다. 응답은 후속 요청에서 더 빠른 액세스를 위해 Redis를 사용하여 캐시됩니다.
from fastapi import FastAPI app = FastAPI() # Sample data representing users in a database users_db = { 1: {"id": 1, "name": "Alice", "email": "[email protected]", "age": 25}, 2: {"id": 2, "name": "Bob", "email": "[email protected]", "age": 30}, 3: {"id": 3, "name": "Charlie", "email": "[email protected]", "age": 22}, } @app.get("/users/{user_id}") @cache_response(ttl=120, namespace="users") async def get_user_details(user_id: int): # Simulate a database call by retrieving data from users_db user = users_db.get(user_id) if not user: raise HTTPException(status_code=404, detail="User not found") return user
실행을 통해 Fastapi 응용 프로그램을 시작하십시오 :
uvicorn main:app --reload
이제 :
를 통해 사용자 세부 정보를 가져와 API를 테스트 할 수 있습니다.
http://127.0.0.1:8000/users/1
첫 번째 요청은 users_db에서 데이터를 가져 오지만 후속 요청은 redis에서 데이터를 검색합니다.
Redis에 저장된 키를 검사하여 캐시를 확인할 수 있습니다. Redis Cli :
redis-cli KEYS *
당신은 ttl까지 Redis에 저장된 모든 키를 얻게됩니다.
: 사용자 데이터가 처음으로 요청되면 API는 데이터베이스 (Users_DB)에서 가져 와서 120 초의 시간 간 (TTL)으로 Redis를 저장합니다.
TTL 기간 내에 동일한 사용자에 대한 후속 요청은 Redis에서 직접 제공되므로 응답이 더 빠르고 데이터베이스의 부하를 줄입니다.
120 초 후에 캐시 항목이 만료되고 다음 요청에서 데이터가 다시 데이터베이스에서 가져와 캐시를 새로 고칩니다.
이 튜토리얼에서 간단한 사용자 세부 사항 예제를 사용하여 FastApi 응용 프로그램에서 Redis 캐싱을 구현하는 방법을 보여주었습니다. API 응답을 캐싱하면 특히 자주 변경되지 않는 데이터의 경우 응용 프로그램의 성능을 크게 향상시킬 수 있습니다.
이 기사가 유용하다면 Upvote를하고 공유하십시오.
부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.
Copyright© 2022 湘ICP备2022001581号-3