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
WBOYavant
2023-06-03 18:24:011927parcourir

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, ...] 是值

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)

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()

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer