ホームページ  >  記事  >  データベース  >  Redis+Pythonをメッセージキューとして使用する方法

Redis+Pythonをメッセージキューとして使用する方法

WBOY
WBOY転載
2023-06-03 18:24:011887ブラウズ

1. lpush および brpop と組み合わせて redis の List タイプを使用して、達成します

はじめに

  • まず、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.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)

問題のレビュー

前に述べました。は、ブロックが長すぎて切断されるという問題です。問題を解決するための

方法は次のとおりです。接続を関数として扱い、エラーをキャプチャし、問題が発生したときに再接続します。

rree

以上がRedis+Pythonをメッセージキューとして使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。