Maison  >  Article  >  développement back-end  >  Comment Redis implémente-t-il la file d’attente de messages ?

Comment Redis implémente-t-il la file d’attente de messages ?

小云云
小云云original
2018-02-27 13:26:469540parcourir

Modifiez le traitement des requêtes du serveur instantané en traitement asynchrone pour soulager la pression sur le serveur et réaliser l'acquisition séquentielle des données. Cet article explique principalement comment Redis implémente les files d'attente de messages, dans l'espoir d'aider tout le monde.

Comment Redis implémente-t-il la file d’attente de messages ?

La file d'attente de messages, en termes simples, est un conteneur qui enregistre temporairement les messages pendant le processus de transmission des messages. Il peut transmettre des données entre des applications sur différentes plates-formes et dans différentes langues. , et l'écriture de données peut être implémentée de manière asynchrone, ce qui peut jouer un très bon rôle dans la résolution de problèmes de concurrence importants.

Parlons du scénario dans lequel j'utilise maintenant la file d'attente de messages : mon système doit recevoir les demandes des clients en temps réel (demandes périodiques) et enregistrer les données demandées dans la base de données. La quantité de données pour chaque demande. est très petit. Cependant, en raison de la nécessité d'exploiter fréquemment la base de données, le système a rencontré des goulots d'étranglement en termes de performances. L'idée originale était de stocker ces données directement dans Redis, mais si vous y réfléchissez bien, même si la quantité de données à chaque fois n'est pas importante, car les données sont cycliques et continueront de croître, bien que Redis ait également une fonction de persistance, si vous comptez sur la persistance Si vous l'enregistrez sur le disque dur, vous perdrez l'avantage de Redis en tant que base de données en mémoire, vous avez donc finalement décidé d'utiliser une file d'attente de messages.

La méthode est la suivante :

Les données demandées à chaque fois sont écrites directement dans la file d'attente des messages, puis une réponse est donnée au client. Un fil de discussion est ouvert en arrière-plan pour surveiller. la file d'attente des messages.Une fois les données écrites, la file d'attente des messages est obtenue. Les données sont écrites dans la base de données mysql, de sorte que les données en temps réel puissent être écrites dans la base de données de manière asynchrone, évitant ainsi le goulot d'étranglement du système causé par le fonctionnement direct du système. base de données.

Alors la question est : quelle file d'attente de messages utiliser ? Les files d'attente de messages les plus courantes sont désormais telles que : RabbitMQ, ActiveMQ, etc., leur technologie est relativement mature et très efficace. Cependant, étant donné que le projet lui-même a utilisé Redis (pour la mise en cache) et que la quantité de données à chaque fois est relativement faible, Redis n'est pas seulement une base de données clé-valeur, il prend en charge des types de données riches, tels que HashMap, Set, List, etc., parmi lesquels The List peut être utilisée comme file d'attente de messages et Redis List prend en charge les commandes de blocage telles que blpop et brpop, qui peuvent pleinement répondre à mes besoins. Le code de test simple est le suivant :

//产生数据
import redis.clients.jedis.Jedis;
public class RedisProducer {
    /** 
     * jedis操作List 
     */  
    public static void main(String[] args){
        Jedis jedis = new Jedis("192.168.10.209", 6379); 
        for(int i = 0;i<10;i++) {
            jedis.lpush("informList","value_" + i);  
        }
        jedis.close();
    }
}
//消费数据
import java.util.List;
import redis.clients.jedis.Jedis;
public class RedisConsumer {
    /** 
     * jedis操作List 
     */  
    public static void main(String[] args){
       ScheduleMQ mq = new ScheduleMQ();
       mq.start();
    }   
}
class ScheduleMQ extends Thread {
    @Override
    public void run() {
        while(true) {
            Jedis jedis = new Jedis("192.168.10.209", 6379);
            //阻塞式brpop,List中无数据时阻塞
            //参数0表示一直阻塞下去,直到List出现数据
            List<String> list = jedis.brpop(0, "informList");
            for(String s : list) {
                System.out.println(s);
            }
            jedis.close();
        }
    }
}

Recommandations associées :

PHP Comment utiliser la file d'attente de messages Redis pour publier Weibo

Implémentation PHP Partage d'exemples de classe de file d'attente de messages

File d'attente de messages pour la programmation avancée PHP

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:
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