FastAPI에서 Redis를 비동기로 사용하도록 설정하기
앞으로는 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