Maison >développement back-end >tutoriel php >Comment utiliser Redis pour effectuer des opérations de file d'attente ?Résumé de l'exemple de code d'opération Redis ?
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('Redis服务器IP', 6379); while (true) { $redis->lPush('list1', 'A_'.date('Y-m-d H:i:s')); sleep(rand()%3); } ?>
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('Redis服务器IP', 6379); while(true) { try { var_export( $redis->blPop('list1', 10) ); } catch(Exception $e) { //echo $e; } }
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='127.0.0.1', port=6379) while True: now = time. strftime("%Y/%m/%d %H:%M:%S") redis.lpush('test_queue', now) time.sleep(1)
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='127.0.0.1', port=6379) while True: res = redis.rpop('test_queue') if res == None: pass else: print str(res)
Exemple de code :
Opération de mise en file d'attente
<?php $redis = new Redis(); $redis->connect('127.0.0.1',6379); while(True){ try{ $value = 'value_'.date('Y-m-d H:i:s'); $redis->LPUSH('key1',$value); sleep(rand()%3); echo $value."\n"; }catch(Exception $e){ echo $e->getMessage()."\n"; } } ?>
2. Opération de retrait de la file d'attente
<?php $redis = new Redis(); $redis->pconnect('127.0.0.1',6379); while(True){ try{ echo $redis->LPOP('key1')."\n"; }catch(Exception $e){ echo $e->getMessage()."\n"; } sleep(rand()%3); } ?>
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!