computer science

FastAPI에서 Redis를 비동기로 사용하도록 설정하기

CoreTree 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

 

반응형