Comment utiliser Redis pour effectuer des opérations de file d'attente ?Résumé de l'exemple de code d'opération Redis ?

伊谢尔伦
Libérer: 2023-03-14 08:26:02
original
1363 Les gens l'ont consulté

Comment utiliser Redis pour les opérations de file d'attente

Reids est un système de stockage clé-valeur open source relativement avancé, implémenté en ANSI C. Il est similaire à memcached, mais prend en charge le stockage de données persistant et la valeur prend en charge plusieurs types : String (identique à la valeur dans memcached), liste, ensemble (Set), ensemble ordonné (OrderSet ) et hachage. Tous les types de valeur prennent en charge les opérations atomiques, telles que l'ajout et l'affichage d'éléments dans des listes, l'insertion et la suppression d'éléments dans des collections, etc. La plupart des données de Rdids se trouvent en mémoire et son efficacité de lecture et d'écriture est très élevée. Il fournit deux méthodes de persistance : AOF (ajout d'un fichier d'enregistrement d'opération) et DUMP (sauvegarde régulière des données). Redis prend en charge un mécanisme de VM (mémoire virtuelle) personnalisé Lorsque la capacité des données dépasse la mémoire, une partie de la valeur peut être stockée dans un fichier. Dans le même temps, Redis prend en charge le mécanisme maître-esclave, qui peut effectuer la réplication des données.
Vous pouvez utiliser la structure de liste de Redis comme file d'attente.
À partir des scénarios et fonctions de Redis ci-dessus, pour nos activités de développement actuelles, dans quels scénarios pouvons-nous introduire Redis au lieu d'utiliser une si bonne chose ? la situation tragique qui a évolué vers « Redis pour le plaisir d'utiliser Redis » ? Bien entendu, il est très important d’analyser des questions spécifiques en détail.
Mise en cache ? Cache distribué ? file d'attente? File d'attente distribuée ?
Certaines applications système (telles que les applications de télécommunications, bancaires et Internet à grande échelle, etc.) l'utiliseront. Bien sûr, le memcache désormais populaire en est une bonne preuve ; et peut faire mieux (pas d'application pratique, donc il suffit de le jeter). Mais depuis Redis, je peux sentir que Redis peut inclure à la fois des files d'attente et des caches, et ne causera pas de problèmes dans un environnement simultané, car les opérations dans Redis sont toutes des opérations atomiques.
Il n'est pas nécessaire de commenter lequel est meilleur ou pire, l'existence en est la raison, et choisir celui qui vous convient est le meilleur.
Commençons à jouer avec la conception de file d'attente (distribuée) YY dans Redis. Veuillez me donner quelques conseils.
Scénario de situation :
Les projets actuels sont déployés sur plusieurs serveurs ou plusieurs IP, et le frontend est distribué via F5, il est donc impossible de déterminer sur quel serveur atterrit la requête de l'utilisateur. Pour le projet, il existe une conception Flash Kill. Ce type de déploiement n'était pas envisagé au début, mais c'était aussi le moyen le plus simple de le gérer, en verrouillant directement les enregistrements de ligne dans la table de la base de données (sur Oracle). . On peut dire que pour différents déploiements d'applications et un seul serveur de base de données, ce problème de concurrence peut être résolu « facilement ». Alors réfléchissez maintenant à l'opportunité de le déplacer vers l'application pour empêcher le serveur de base de données d'être impliqué dans l'entreprise.
Par exemple, il existe actuellement 2 serveurs d'applications et 1 serveur de base de données. L'idée est de déployer Redis sur le serveur de base de données. Lorsque les deux serveurs fonctionnent simultanément en cache ou en file d'attente, ils obtiennent d'abord les objets proxy sur les deux serveurs d'applications depuis le serveur Redis, puis les ajoutent à la liste. . opération.
Regardez l'implémentation du code (PHP)
Mettez le fichier d'opération en file d'attente list_push.php

Le code est le suivant :

<?php 
$redis = getRedisInstance();//从Redis服务器拿到redis实例 
$redis->connect(&#39;Redis服务器IP&#39;, 6379); 
while (true) { 
$redis->lPush(&#39;list1&#39;, &#39;A_&#39;.date(&#39;Y-m-d H:i:s&#39;)); 
sleep(rand()%3); 
} 
?>
Copier après la connexion

Exécutez # php list_push.php &
Le code du fichier list_pop.php de l'opération de retrait de la file d'attente

est le suivant :

<?php 
$redis = getRedisInstance();//从Redis服务器拿到redis实例 
$redis->pconnect(&#39;Redis服务器IP&#39;, 6379); 
while(true) { 
try { 
var_export( $redis->blPop(&#39;list1&#39;, 10) ); 
} catch(Exception $e) { 
//echo $e; 
} 
}
Copier après la connexion

Méthode d'implémentation (Python)
Entrez dans la file d'attente (write. py)

Le code est le suivant :

#!/usr/bin/env python 
import time 
from redis import Redis 
redis = Redis(host=&#39;127.0.0.1&#39;, port=6379) 
while True: 
now = time.
strftime("%Y/%m/%d %H:%M:%S") 
redis.lpush(&#39;test_queue&#39;, now) 
time.sleep(1)
Copier après la connexion

2. Retirer la file d'attente (read.py)

Le code est le suivant :

#!/usr/bin/env python 
import sys 
from redis import Redis 
redis = Redis(host=&#39;127.0.0.1&#39;, port=6379) 
while True: 
res = redis.rpop(&#39;test_queue&#39;) 
if res == None: 
pass 
else: 
print str(res)
Copier après la connexion


Exemple de code :

Opération de mise en file d'attente

<?php
$redis = new Redis();
$redis->connect(&#39;127.0.0.1&#39;,6379);
while(True){
  try{
    $value = &#39;value_&#39;.date(&#39;Y-m-d H:i:s&#39;);
    $redis->LPUSH(&#39;key1&#39;,$value);
    sleep(rand()%3);
    echo $value."\n";
  }catch(Exception $e){
    echo $e->getMessage()."\n";
  }
}
?>
Copier après la connexion

2. Opération de retrait de la file d'attente

<?php
$redis = new Redis();
$redis->pconnect(&#39;127.0.0.1&#39;,6379);
while(True){
  try{
    echo $redis->LPOP(&#39;key1&#39;)."\n";
  }catch(Exception $e){
  echo $e->getMessage()."\n";
  }
  sleep(rand()%3);
}
?>
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:php.cn
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
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!