>데이터 베이스 >Redis >redis+python을 메시지 큐로 사용하는 방법

redis+python을 메시지 큐로 사용하는 방법

WBOY
WBOY앞으로
2023-06-03 18:24:011892검색

1. lpush 및 brpop과 결합된 List 유형의 redis를 사용하여 구현

Introduction

  • 먼저 Redis의 List는 선입선출 규칙을 구현할 수 있는 대기열과 동일합니다

  • brpop을 사용하는 이유는 큐에 큐가 없으면 큐에 팝업 요소가 있거나 대기 시간이 초과될 때까지 차단되기 때문입니다.

시뮬레이션 문제:

  • 너무 많습니다. 접속하면 서버 처리 속도가 너무 느리고, 모든 사용자가 기다리고 서버가 피드백을 하면 시간이 너무 오래 걸리고, http 연결 시간이 초과되어 서버 오류가 발생합니다.

시뮬레이션 구현 과정:

  • 다수의 사용자 접속 상황을 시뮬레이션하기 위해 멀티 스레딩을 사용하여 지속적으로 사물(데이터)을 큐에 넣는 클라이언트가 있습니다

  • 서버가 있습니다 지속적으로 대기열에서 꺼내는 작업 인쇄하고 매번 2초 동안 대기 시간을 설정합니다

redis의 목록 구조 소개

key [value, value]
key 代表List的名字, [value, ...] 是值

client.py

import random
import threading
import redis
import config

lock = threading.Lock()
lock.acquire()
lock.release()


pool = redis.ConnectionPool(host=config.HOST, port=config.PORT, 
                            decode_responses=True, password=config.PASSWORD)

r = redis.Redis(connection_pool=pool)

# 客户往redis 中放数据
def fun1(redisObj):
    value = random.randint(0, 100)
    # 往ccc列表中存放
    print("开始发送数据:", value)
    redisObj.lpush("print",str(value))

for i in range(100):
    threading.Thread(target=fun1, args=(r,)).start()

server server.py

import redis
import time
import config


pool = redis.ConnectionPool(host=config.HOST, port=config.PORT, decode_responses=True, password=config.PASSWORD)
r = redis.Redis(connection_pool=pool)
# 服务端不断的取
while True:
    value = r.brpop("print")
    time.sleep(2)
    print(value)

문제 검토

앞서 너무 오랫동안 차단이 발생하고 연결이 끊긴다고 말씀드렸는데, 연결 문제를 해결하는 방법은 다음과 같습니다. 연결을 함수로 취급하고, 오류를 잡아내고, 문제가 발생하면 다시 연결하는 것입니다.

아아아아

위 내용은 redis+python을 메시지 큐로 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제