-
FastAPI에서 Redis를 비동기로 사용하도록 설정하기computer science 2023. 6. 17. 14:15반응형
앞으로는 FastAPI를 Uvicorn + Gunicorn 쌍두마차로 활용하자
FastAPI는 Python에서 고성능, 쉽고 빠른(프로그래밍의 측면에서), 웹 API를 구축하는데 사용되는 현대적인, 빠른(실행 시간의 측면에서), 웹 프레임워크다. 이는 데이터 유효성 검사, 직렬화, 문서화
stocktrees.com
필자는 Flask로 주로 개발하다가 FastAPI로 넘어오면서 가장 곤혹을 치뤘던것이 바로 비동기처리로 모든 코드를 변경하고 적응하는 것이었다. 이미 검색하면 답이 다 나와있지만 그럼에도 기록차원 + redis구현에 좀더 쉬운 가이드가 필요한 개발자가 있을지도 모르니 블로그 글을 남겨본다.
자 이제 제목 그대로다. redis를 비동기적으로 설정해보자.
여기서는 aioredis 패키지를 통해 구현해볼 것이므로 이를 설치해준다.
pip install aioredis
참고로 aioredis의 버전이 2.x 냐 아니냐에 따라 구현이 많이 다르다. (필자는 aioredis 2.x기준으로 설치함)
2.x버전이 더 사용성이 좋으므로 설치후 pip list를 통해 버전을 확인해본다.
반응형이제 redis_driver.py를 구현해보자. 비동기적으로 동작시킬것이므로 async, await 구문이 추가된다.
redis_driver.py
import aioredis class RedisDriver: def __init__(self): self.redis_url = f'redis://{your_url}' self.redis_client = aioredis.from_url(self.redis_url) async def set_key(self, key, val, ttl=60): await self.redis_client.set(key, value) if ttl: await self.redis_client.expire(key, ttl) return True async def get_key(self, key): return await self.redis_client.get(key) # * test code if __name__ == '__main__': import asyncio redis_instance = RedisDriver() async def main(): await redis_instance.set_key('test', 'test_value', 10) await redis_instance.set_key('test2', 'test2_value', 10) print(await redis_instance.get_key('test')) print(await redis_instance.get_key('test2')) asyncio.run(main())
가볍게 key를 기록하고 ttl까지 입력되도록 만들었다. (ttl을 지정시 해당 시간이 지나면 데이터가 자동으로 휘발된다)
아래의 테스트 코드를 통해 실제로 구동되는지 확인해보자.
$ python redis_driver.py >> test_value >> test2_value
(아래 두줄처럼 결과가 나와주면 redis에 비동기적으로 기록된 key를 잘 읽었다는 뜻이다.)
반응형api.py 예시를 작성해보자.
api.py
from fastapi import FastAPI from redis_driver import RedisDriver app = FastAPI() redis_instance = RedisDriver() @app.get("/set_redis_key", description="redis에 key, value, ttl 세팅하고, 해당 값 리턴하기") async def set_redis_key(key: str = "my_key", value: str = "my_value", ttl: int = 60): await redis_instance.set_key(key, value, ttl) return await redis_instance.get_key(key) @app.get("/get_redis_key", description="해당 key의 value 리턴하기") async def get_redis_key(key: str = "my_key"): return await redis_instance.get_key(key)
이제 서버를 실행해서 직접 호출해보면 될 것이다
uvicorn api:app --reload ## http://localhost:8000 으로 접속가능
서버 실행 후 브라우저에서 아래 주소로 접속했을때
http://localhost:8000/set_redis_key?key=your_key&value=good&ttl=30
--> good이라는 key가 나오면 success!
이것도
http://localhost:8000/get_redis_key?key=your_key
--> good이라는 key가 나오면 success!
앞으로는 FastAPI를 Uvicorn + Gunicorn 쌍두마차로 활용하자
FastAPI는 Python에서 고성능, 쉽고 빠른(프로그래밍의 측면에서), 웹 API를 구축하는데 사용되는 현대적인, 빠른(실행 시간의 측면에서), 웹 프레임워크다. 이는 데이터 유효성 검사, 직렬화, 문서화
stocktrees.com
반응형지금 엔비디아는 고평가? 그럼에도 투자해야하는 5가지 이유
지난 포스팅에서는 엔비디아(NVIDIA)가 너무 고평가이고 투자하기 좋은 시점이 아닐 수 있다고 설명했다. 그러나 미래가치반영의 시각으로 보았을때는 현재의 가격이 적정수준일 수도 있다. 심지
stocktrees.com
반응형'computer science' 카테고리의 다른 글
Triton server memory leak (메모리 릭) malloc설정을 바꿔보자 (0) 2024.05.13 ChatGPT + Code Interpreter 세팅 & 시각화 잘하려면 알아야 할 5가지! (0) 2023.07.16 앞으로는 FastAPI를 Uvicorn + Gunicorn 쌍두마차로 활용하자 (0) 2023.06.27 Python Code for Dictionary Dot Accessible & Nested Key Handling (0) 2023.06.24