본문 바로가기
Coding

Python에서 캐싱 및 Pub/Sub에 Redis를 사용하는 방법

by Emily Blunt 2022. 4. 6.
반응형

Python에서 캐싱 및 Pub/Sub에 Redis를 사용하는 방법

 

Python에서 Redis의 일반적인 사용 사례 알아보기

Unsplash의 이미지.

Redis는 인메모리 키-값 데이터베이스, 캐싱 시스템 및 게시/구독 메시지 브로커로 사용할 수 있는 오픈 소스 인메모리 데이터 구조 저장소입니다. Redis는 모든 데이터가 디스크가 아닌 메모리에 저장된다는 점에서 특별하므로 매우 빠르고 캐싱에 널리 사용되는 옵션입니다.

이전 기사에서 Redis 데이터 유형의 필수 사항과 공통 명령에 대해 소개했습니다. 이 기사에서는 Python에서 캐싱 및 게시자/구독자(pub/sub)에 Redis를 사용하는 방법에 중점을 둘 것입니다.

Redis 서버를 컴퓨터에 직접 설치할 수 있습니다. 그러나 학습 목적으로 Redis용 Docker 컨테이너를 사용하는 것이 좋습니다. 테스트에 항상 최신 버전의 Redis를 사용할 수 있기 때문입니다. Docker 컨테이너로 Redis 서버를 시작하려면 셸에서 다음 명령을 실행합니다.

높은 포트 16379는 컴퓨터에서 잠재적인 포트 충돌을 방지하는 데 사용됩니다. 또한 Redis 서버와 연결하기 쉽도록 Docker 네트워크가 생성되었습니다. redis-cli:

이제 다음을 사용하여 일반 명령을 실행할 수 있습니다. redis-cli 이전 기사에서 설명했듯이. 그러나 이 기사의 초점은 Python에서 Redis를 사용하는 방법이므로 계속 진행해 보겠습니다.

Python에서 Redis 서버에 액세스하려면 Python Redis 클라이언트가 필요합니다. 추천하는 것은 redis-py, 성숙하고 잘 지원됩니다. 이것은 현재 Python의 "가야 할 길"로 간주됩니다.

사용 redis-py, 컴퓨터에 설치해야 합니다. 기존 라이브러리와 혼동되지 않도록 가상 환경에 설치하는 것이 좋습니다. 간단하게 하기 위해 다음을 사용할 것입니다. 콘다 가상 환경을 생성하려면:

그만큼 (redis) 명령줄에서 가상 환경이 성공적으로 생성 및 활성화되었음을 나타냅니다. 에 대해 더 알고 싶다면 콘다이 기사는 좋은 참고가 될 수 있습니다.

그런 다음 설치하려면 redis-py운영:

$ pip install redis

설치할 라이브러리는 redis아니다 redis-py. Python 명령을 대화식으로 더 쉽게 실행할 수 있도록 가상 환경에 iPython도 설치합니다.

$ pip install ipython

그런 다음 iPython을 시작하고 Redis와 상호 작용할 수 있습니다.

Redis 서버에 인증이 활성화되어 있으면 다음을 사용하여 암호를 지정할 수 있습니다. password 매개변수. 다음을 지정할 수도 있습니다. db Redis 서버에 여러 데이터베이스가 있는 경우 매개변수입니다. 기본 데이터베이스 번호는 0이며 지정하지 않을 때 사용하는 기본 번호입니다.

포트를 올바르게 지정해야 합니다. 여기서는 기존의 6379가 아닌 사용자 지정 상위 포트 16379입니다. 또한 Redis의 키와 값은 바이트, 문자열, 정수 및 부동 소수점 수만 될 수 있습니다. 모범 사례를 위해 일반적으로 의미 있는 문자열만 키로 사용해야 합니다. 그러나 객체나 배열과 같은 기본 유형이 아닌 값의 경우 Redis에서 값으로 설정되기 전에 먼저 문자열 또는 바이트로 변환해야 합니다. 그만큼 json.dumps 함수는 일반적으로 Python의 사전 또는 목록을 JSON 문자열로 변환하는 데 사용됩니다.

반면에 기본적으로 모든 응답은 Python에서 바이트로 반환됩니다. Redis 클라이언트의 모든 문자열 응답을 디코딩하려면 다음을 지정할 수 있습니다. decode_responses 그리고 encoding 클라이언트를 생성할 때 매개변수:

문자열 인코딩/디코딩 및 유니코드/UTF-8 개념에 익숙하지 않은 경우 이 문서가 도움이 될 수 있습니다.

Redis 키를 삭제하려면 다음을 사용하십시오. delete 클라이언트의 방법:

결과에서, 1 키가 성공적으로 삭제되었음을 의미하며, 0 키가 존재하지 않음을 나타냅니다.

확인해야 할 Redis 키가 많을 때 라는 편리한 방법이 있습니다.scan_iterSCAN 명령과 유사하지만 커서를 기억하고 지정할 필요가 없기 때문에 훨씬 더 사용하기 편리합니다.

여기에서 콜론(:)은 객체 유형과 id를 구분하기 위해 사용되며 실제로는 특별한 의미가 없습니다. 그만큼 scan_iter 메소드는 입력으로 Redis 패턴을 기대합니다. 패턴을 지정하지 않으면 모든 키가 반환됩니다. 특히 "스타"*"는 임의의 수의 문자와 일치합니다. "와 동일합니다..*” 패턴을 정규식으로 표현합니다.

위에서 우리는 Python에서 Redis의 매우 기본적인 사용법을 소개했습니다. Python의 대부분의 Redis 메서드에는 기본 redis-cli 명령 상대. 다른 방법에 관심이 있거나 사용해야 하는 경우 네이티브에 중점을 둔 이전 기사를 참조할 수 있습니다. redis-cli 명령.

이제 일반적으로 사용되지 않는 Redis 파이프라인 및 pub/sub에 집중해 보겠습니다. redis-cli그러나 드라이버에서 더 일반적으로 사용됩니다(이 게시물의 Python).

Redis의 경우 파이프라인은 동시에 여러 명령을 실행하는 방법입니다. 명령은 버퍼링되고 단 하나의 요청만 Reids 서버로 전송됩니다. 이러한 방식으로 Redis 서버와 클라이언트 간의 통신 오버헤드가 크게 줄어들고 속도/효율이 증가할 수 있습니다. 파이프라인은 많은 Redis 명령을 순차적으로 실행해야 할 때 매우 유용합니다.

파이프라인은 SQL 데이터베이스의 트랜잭션과 유사합니다. 그러나 먼저 트랜잭션을 시작한 다음 커밋하는 대신 여기에서 먼저 파이프라인 개체를 만든 다음 실행합니다.

보시다시피 파이프라인은 사용하기 매우 간단합니다. 더 복잡한 상황에서 작동하도록 하는 고급 설정도 있습니다.

Redis는 일반적으로 사용되는 경량 메시지/대기열 또는 게시/구독(출판/구독) 시스템입니다. 예를 들어 Airflow는 스케줄러에서 작업자에게 메시지를 전달하는 브로커로 사용합니다.

다른 메시지/대기열 시스템과 마찬가지로 메시지를 게시하고 수신하려면 먼저 채널과 구독을 만들어야 합니다. 채널은 Google Cloud Platform의 Pub/Sub 서비스와 같은 일부 메시지/대기열 시스템에서 주제라고 하는 경우가 있습니다.

사실, 우리는 명시적으로 채널을 만들 필요가 없습니다. 채널은 위와 같이 처음 구독하면 자동으로 생성됩니다. 또한 동시에 여러 채널을 구독할 수 있습니다. 곧 볼 수 있듯이 패턴별로 여러 채널을 구독할 수도 있습니다. psubscribe 아래 방법.

이제 채널에 몇 가지 메시지를 게시해 보겠습니다.

Redis 클라이언트(redis_cli)는 위에서 만든 PubSub 개체가 아니라 채널에 메시지를 게시하는 데 사용됩니다. 반환된 숫자는 메시지가 배달된 구독자 수입니다. 새 구독을 만들고 숫자가 그에 따라 변경되는지 살펴보겠습니다.

이 예에서psubscribe 패턴으로 구독이 생성됨을 의미합니다. 생성된 구독은 지정된 패턴과 일치하는 모든 채널을 수신합니다.

우리가 에 게시할 때 channel-*반환값은 1로 메시지가 하나의 구독자, 즉 패턴으로 생성된 구독자에게만 게시되었음을 의미합니다. channel-*. 그러나 메시지가 에 게시되었을 때 channel-1 다시, 반환 값은 2로 변경되며, 이는 메시지가 두 명의 구독자에게 게시되었음을 의미합니다. 사실, 하나의 PubSub 객체가 생성되고 사용됩니다. 그러나 이 PubSub 객체에는 두 개의 구독/구독자가 있습니다. channel-1 다른 하나는 일치하는 모든 채널에 channel-*.

이제 시스템에서 게시된 메시지를 가져오겠습니다. 이렇게 하려면 다음을 호출해야 합니다. get_message PubSub 개체의 메서드입니다.

그만큼 get_message 메소드는 사용 가능한 경우 다음 메시지를 가져오고 그렇지 않으면 없음을 가져옵니다. 4개의 키가 있는 사전을 반환합니다.

  • type — 데이터 유형. 값은 subscribe, psubscribe, message등. message 는 게시된 실제 데이터를 의미하고 다른 것들은 구독 유형을 의미하며 메타데이터로 볼 수 있습니다. 우리는 일반적으로 다음과 같은 데이터에만 관심이 있습니다. message 유형.
  • pattern — 채널의 패턴입니다. 다음을 제외한 모든 메시지에 대해 None입니다. pmessage 위와 같이 입력합니다. 이 예에서 메시지가 패턴과 일치하는 채널에 게시됨을 의미합니다. channel-*.
  • channel — 메시지가 게시되는 채널입니다.
  • data — 게시된 실제 메시지 데이터입니다. "메타데이터" 구독의 경우, get_message 메소드가 호출되었습니다. 메시지 유형의 경우 전송된 실제 메시지입니다.

저처럼 새로운 구독이 생성될 때와 구독을 취소할 때 "메타데이터" 메시지가 게시됩니다.

일반적으로 메타데이터를 너무 많이 사용하지 않고 게시된 실제 메시지로만 작업하면 됩니다.

위의 간단한 예에서 볼 수 있듯이 채널(토픽)과 구독을 만든 다음 Redis로 메시지를 게시/수신하는 것은 매우 간단합니다. 그런 다음 수신된 데이터를 구문 분석하고 애플리케이션에서 사용하는 몇 가지 로직을 생성할 수 있습니다.

이 기사에서는 Python에서 Redis의 가장 일반적인 사용 사례를 소개합니다. 네이티브 Redis 명령 사용에 대한 이전 기사와 함께 이제 Redis에 대해 충분히 이해하고 작업에 사용할 수 있습니다.

반응형

댓글