[python] Tornado와 레디스(Redis)의 통합

소개

Tornado는 Python으로 작성된 비동기 웹 프레임워크로, 이벤트 기반 방식으로 동작합니다. Tornado의 빠른 처리 속도와 확장성은 대규모의 동시 요청을 처리하는 경우에 매우 유용합니다.

Redis는 인메모리 데이터베이스로, 빠른 읽기/쓰기 작업과 데이터의 지속성을 제공합니다. Redis는 대용량 데이터를 처리하는 데 특히 효율적이며, 키-값 형태의 데이터를 저장하고 인덱싱할 수 있습니다.

이번 블로그 포스트에서는 Tornado와 Redis를 함께 사용하는 방법에 대해 알아보겠습니다.

Tornado와 레디스 연결하기

Tornado에서 레디스와 통신하려면 레디스 클라이언트를 사용해야 합니다. 이를 위해서는 redis 패키지를 설치해야 합니다.

pip install redis

아래는 Tornado와 레디스를 연결하는 간단한 예제입니다.

import tornado.ioloop
import tornado.web
import redis

class MainHandler(tornado.web.RequestHandler):
    def initialize(self):
        # 레디스 클라이언트 생성
        self.r = redis.Redis(host='localhost', port=6379)

    def get(self):
        # 레디스에서 데이터 가져오기
        data = self.r.get('mykey')
        self.write(data)

if __name__ == "__main__":
    app = tornado.web.Application([
        (r"/", MainHandler),
    ])
    app.listen(8888)
    tornado.ioloop.IOLoop.current().start()

위 예제에서는 / URL에 대한 GET 요청을 처리하는 핸들러를 정의했습니다. 핸들러의 initialize 메서드에서 레디스 클라이언트를 초기화하고, GET 요청을 처리하면서 레디스에서 데이터를 가져와 응답으로 보냅니다.

데이터 쓰기와 읽기

Tornado에서 레디스와 상호작용하는 가장 기본적인 작업은 데이터를 쓰고 읽는 것입니다. 이를 위해 setget 메서드를 사용합니다.

# 데이터 쓰기
self.r.set('mykey', 'Hello, Redis')

# 데이터 읽기
data = self.r.get('mykey')

위의 코드에서는 mykey라는 키로 데이터를 쓰고 읽습니다.

Pub/Sub

레디스는 Publish/Subscribe(Pub/Sub) 패턴을 지원하여 메시지 기반의 비동기 통신을 제공합니다. Tornado에서 이 기능을 사용하려면 Pub/Sub 모델에 대한 이벤트 핸들러를 작성해야 합니다.

class MyHandler(tornado.web.RequestHandler):
    def initialize(self):
        self.pubsub = self.r.pubsub()
        # 채널 구독
        self.pubsub.subscribe("my_channel")

    async def on_message(self, message):
        # 채널에서 메시지 수신시 처리 로직
        data = message["data"]
        self.write(data)

async def listen_to_messages():
    while True:
        message = my_handler.pubsub.get_message(ignore_subscribe_messages=True, timeout=10)
        if message:
            await my_handler.on_message(message)

tornado.ioloop.IOLoop.current().add_callback(listen_to_messages)

위의 코드에서는 MyHandler 클래스를 정의하고 on_message 메서드를 구현하여 메시지가 수신되었을 때의 동작을 정의합니다. 그리고 listen_to_messages 함수에서 메시지를 계속해서 수신하도록 합니다.

또한, 이벤트 루프를 통해 비동기적으로 메시지를 수신하고 처리합니다.

마무리

Tornado와 레디스를 함께 사용하면 매우 빠르고 확장 가능한 웹 애플리케이션을 구축할 수 있습니다. 특히 대규모 동시 요청을 처리해야 할 경우에는 이러한 조합이 효과적입니다.

이번 블로그 포스트를 통해 Tornado와 레디스의 통합에 대해 알아보았습니다. Tornado와 레디스를 함께 사용하여 더욱 강력한 웹 애플리케이션을 만들어 보세요!

참고 자료:

  • Tornado 공식 문서: https://www.tornadoweb.org
  • Redis 공식 문서: https://redis.io