Maison > base de données > Redis > Comment utiliser redis+python comme file d'attente de messages

Comment utiliser redis+python comme file d'attente de messages

WBOY
Libérer: 2023-06-03 18:24:01
avant
1902 Les gens l'ont consulté

1. Utilisez le type List de redis combiné avec lpush et brpop pour implémenter

Introduction

  • Tout d'abord, la liste de redis est équivalente à une file d'attente, qui peut implémenter la règle du premier entré, premier sorti

  • La raison pour laquelle brpop est utilisé est que lorsqu'il n'y a pas de file d'attente dans la file d'attente, il se bloquera jusqu'à ce qu'il y ait un élément pop-up dans la file d'attente ou jusqu'à l'expiration du délai d'attente

Problème de simulation :

  • Trop de accès, la vitesse de traitement du serveur est trop lente, si chaque utilisateur attend et que le serveur renvoie un retour, le temps est trop long, la connexion http a expiré et une erreur de serveur s'est produite.

Processus de mise en œuvre de la simulation :

  • Il existe un client qui met continuellement des éléments (données) dans la file d'attente, en utilisant le multi-threading pour simuler la situation d'un grand nombre d'accès d'utilisateurs

  • Il existe un serveur qui retire continuellement les éléments de la file d'attente Imprimez et définissez le temps de veille de 2 secondes à chaque fois

Introduction à la structure de liste de redis

key [value, value]
key 代表List的名字, [value, ...] 是值
Copier après la connexion

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()
Copier après la connexion

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)
Copier après la connexion

Examen des problèmes

Nous avons déjà dit qu'il y avait un blocage qui prenait trop de temps et qui se déconnectait. Voici comment résoudre le problème de connexion : traitez la connexion comme une fonction, détectez les erreurs et reconnectez-vous lorsqu'un problème survient.

import redis
import time
import config

def get_redis():
    pool = redis.ConnectionPool(host=config.HOST, port=config.PORT, decode_responses=True, password=config.PASSWORD)
    r = redis.Redis(connection_pool=pool)
    return r
# 服务端不断的取
r = get_redis()
    
while True:
    try:
        value = r.brpop("print")
        time.sleep(2)
        print(value)
    except Exception as e:
        print("等待超时重连")
        r = get_redis()
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:yisu.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal