[Python] Redis - with문을 사용한 연결
개요
2023.06.03-[Python] redis 사용하기, 2024.08.14-[Python] Redis - 비동기 연결에서 redis-py 공식 문서를 참조해 Python으로 Redis에 연결하고 작업을 수행해 보았다. 그 후, 컨텍스트 매니저라는 개념을 새로 알게 되었는데…… Redis 연결도 컨텍스트 매니저로 관리하는 게 좋아 보였다. 공식 문서에서는 with 문 사용 없이 일반적인 방법만 기재되어 있는데, 이번 글에서 with문을 사용한 연결이 가능한지 확인해보려고 한다.
with문 사용 가능 여부
결론만 말하자면 동기 방식, 비동기 방식 모두 with 문 사용이 가능하다.
2025.01.15-[Python] context manager - 리소스 관리에서 with 문을 사용하기 위해서는 __enter__, __exit__ 과 같은 메서드가 정의되어 있어야 함을 알았다. redis-py 라이브러리 github를 확인해보면 필요한 메서드가 잘 정의되어 있음을 확인할 수 있다.
동기 방식 | 비동기 방식 |
![]() |
![]() |
즉, 컨텍스트 매니저와 비동기 컨텍스트 매니저 모두 사용하여 redis 클라이언트를 정의하고 사용할 수 있다.
예시
with문을 사용하여 연결했을 때 정상적으로 동작하는지 예시로 확인해 본다.
동기 방식
import redis as redis
from datetime import datetime
def sync_main():
with redis.Redis(host=HOST,
port=PORT) as redis_connection:
print('---- init get ------')
print(datetime.now(), redis_connection.get('running_flag'))
if __name__ == '__main__':
sync_main()
with 문을 사용한 Redis 클라이언트 객체로도 redis 작업을 잘 수행하는 것을 확인할 수 있다.
비동기 방식
import redis.asyncio as redis
import asyncio
from datetime import datetime
async def async_main():
async with redis.Redis(host=HOST,
port=PORT) as redis_connection:
print('---- init get ------')
print(datetime.now(), await redis_connection.get('running_flag'))
if __name__ == '__main__':
asyncio.run(async_main())
비동기 프로그래밍이므로 비동기 컨텍스트 매니저인 async with 문을 사용하고, redis 작업 시 await을 붙여야 한다는 점에서 차이점이 있다. 그 외에는 동기 방식과 동일하게 정상적으로 잘 동작하는 모습을 확인할 수 있다.
참고 문서
https://github.com/redis/redis-py/blob/master/redis/client.py#L94
https://github.com/redis/redis-py/blob/master/redis/asyncio/client.py#L102