Maison  >  Article  >  base de données  >  Explication détaillée de l'implémentation de la file d'attente prioritaire dans Redis

Explication détaillée de l'implémentation de la file d'attente prioritaire dans Redis

WBOY
WBOYoriginal
2023-06-20 08:31:192483parcourir

Explication détaillée de l'implémentation Redis de la file d'attente prioritaire

La file d'attente prioritaire est une structure de données commune qui peut trier les éléments selon certaines règles et maintenir cet ordre pendant les opérations de file d'attente, de sorte que les éléments retirés de la file d'attente suivent toujours la priorité prédéfinie.

En tant que base de données en mémoire, Redis présente également des avantages dans la mise en œuvre de files d'attente prioritaires en raison de ses capacités d'accès aux données rapides et efficaces. Cet article présentera en détail la méthode et l'application de Redis pour implémenter la file d'attente prioritaire.

1. Principes de base de l'implémentation de Redis

Le principe de base de l'implémentation de Redis de la file d'attente prioritaire est de maintenir une liste ordonnée ou un ensemble ordonné, chaque fois qu'un élément est inséré dans l'ordre en fonction de la priorité définie ; un élément apparaît, il est supprimé directement.

Ce qui suit prend un ensemble ordonné comme exemple de démonstration. La même méthode de mise en œuvre est également applicable à une liste ordonnée. Le code et les opérations suivants sont effectués dans redis-cli.

1. Créez un ensemble ordonné
Utilisez la commande ZADD pour créer un ensemble ordonné nommé priorité_queue.

127.0.0.1:6379> ZADD priority_queue 5 "A"
(integer) 1
127.0.0.1:6379> ZADD priority_queue 3 "B"
(integer) 1
127.0.0.1:6379> ZADD priority_queue 4 "C"
(integer) 1
127.0.0.1:6379> ZADD priority_queue 2 "D"
(integer) 1
127.0.0.1:6379> ZADD priority_queue 1 "E"
(integer) 1

À l'heure actuelle, il y a déjà cinq éléments dans priorité_queue, et leurs valeurs et scores sont : E (1), D (2), B (3), C (4), A (5).

2. Afficher l'ensemble ordonné
Utilisez la commande ZRANGE pour afficher la liste des éléments dans priorité_queue.

127.0.0.1:6379> ZRANGE priority_queue 0 -1 WITHSCORES
1) "E"
2) "1"
3) "D"
4) "2"
5) "B"
6) "3"
7) "C"
8) "4"
9) "A"
10) "5"

Le résultat montre la liste des éléments de priorité_queue, avec la valeur et le score de chaque élément. où l’élément E a un score de 1, D a un score de 2, et ainsi de suite.

3. Compressez l'ensemble ordonné
Utilisez la commande ZPOPMIN pour afficher le premier élément dans la file d'attente_priorité et supprimez-le de l'ensemble ordonné.

127.0.0.1:6379> ZPOPMIN priority_queue
1) "E"
2) "1"

L'élément E et son score 1 ont été retirés. À l'étape suivante, E n'apparaîtra plus dans la file d'attente prioritaire.

Le principe de base de l'implémentation de la file d'attente prioritaire par Redis se reflète dans les opérations ci-dessus. Voici quelques autres opérations pratiques au niveau de l'application.

2. Exemples d'applications

1. Utiliser la file d'attente prioritaire pour implémenter la planification des tâches
La planification des tâches est une partie essentielle de l'informatique en cluster, étant donné que certaines tâches peuvent nécessiter une interaction en ligne, nous espérons allouer les tâches sur un nœud aussi efficacement que possible. Soyez aussi uniforme que possible pour minimiser les temps d’attente des tâches. À l'heure actuelle, les files d'attente prioritaires peuvent être utilisées pour mettre en œuvre la planification des tâches.

Dans l'exemple suivant, nous définissons deux instances de base de données, chaque instance gère différents types de tâches. La file d'attente prioritaire est basée sur la liste et utilise les commandes LPUSH et RPOP pour implémenter un système de planification de tâches relativement simple.

127.0.0.1:6379> LPUSH db1 "task_1"
(integer) 1
127.0.0.1:6379> LPUSH db1 "task_2"
(integer) 2
127.0.0.1:6379> LPUSH db1 "task_3"
(integer) 3
127.0.0.1:6379> LPUSH db2 "task_4"
(integer) 1
127.0.0.1:6379> LPUSH db2 "task_5"
(integer) 2
127.0.0.1:6379> LPUSH db2 "task_6"
(integer) 3

Dans cet exemple, db1 et db2 représentent deux instances de base de données différentes, chacune gérant différents types de tâches. Maintenant, nous plaçons la tâche dans la file d'attente correspondante.

127.0.0.1:6379> RPOP db1
"task_1"
127.0.0.1:6379> RPOP db1
"task_2"
127.0.0.1:6379> RPOP db2
"task_4"
127.0.0.1:6379> RPOP db1
"task_3"
127.0.0.1:6379> RPOP db2
"task_5"
127.0.0.1:6379> RPOP db2
"task_6"

Ensuite, nous utilisons la commande RPOP pour supprimer les tâches de la file d'attente dans l'ordre. Étant donné que la position de chaque tâche dans la file d'attente est incertaine, elle n'a pas de priorité claire. Cependant, nous pouvons réaliser un contrôle prioritaire de différents types de tâches en utilisant plusieurs files d'attente.

2. Utilisez la file d'attente prioritaire pour implémenter le filtrage des messages
Le filtrage des messages est un problème que nous rencontrons souvent dans le développement réel, dans un système à haut débit, les messages doivent être filtrés et classés rapidement, par exemple, regrouper des sujets, marquer les messages importants, etc. À l'heure actuelle, la file d'attente prioritaire de Redis peut être utilisée pour implémenter le filtrage des messages.

Dans l'exemple suivant, nous créons deux files d'attente prioritaires pour filtrer respectivement les messages importants et non importants. Les éléments de chaque file d'attente sont le contenu du message et l'horodatage. Le tri par horodatage permet de trier et de filtrer rapidement les messages par heure.

127.0.0.1:6379> ZADD important_messages 1628347641 "Important message 1"
(integer) 1
127.0.0.1:6379> ZADD important_messages 1628357641 "Important message 2"
(integer) 1
127.0.0.1:6379> ZADD important_messages 1628367641 "Important message 3"
(integer) 1
127.0.0.1:6379> ZADD important_messages 1628368641 "Important message 4"
(integer) 1
127.0.0.1:6379> ZADD important_messages 1628369641 "Important message 5"
(integer) 1
127.0.0.1:6379> ZADD normal_messages 1628367645 "Normal message 1"
(integer) 1
127.0.0.1:6379> ZADD normal_messages 1628368645 "Normal message 2"
(integer) 1
127.0.0.1:6379> ZADD normal_messages 1628369645 "Normal message 3"
(integer) 1
127.0.0.1:6379> ZADD normal_messages 1628370645 "Normal message 4"
(integer) 1

Dans cet exemple, important_messages et normal_messages sont les deux files d'attente prioritaires que nous avons créées, qui sont utilisées respectivement pour filtrer les messages importants et non importants. Les éléments de chaque file d'attente sont le contenu du message et l'horodatage.

127.0.0.1:6379> ZRANGE important_messages 0 -1
1) "Important message 1"
2) "Important message 2"
3) "Important message 3"
4) "Important message 4"
5) "Important message 5"
127.0.0.1:6379> ZRANGE normal_messages 0 -1
1) "Normal message 1"
2) "Normal message 2"
3) "Normal message 3"
4) "Normal message 4"

Ensuite, nous utilisons la commande ZRANGE pour afficher la liste des éléments dans la file d'attente prioritaire. L'étape suivante consiste à extraire les messages de la file d'attente en fonction de la priorité.

redis> ZPOPMIN important_messages
1) "Important message 1"
2) "1628347641"
redis> ZPOPMIN normal_messages
1) "Normal message 1"
2) "1628367645"

Les opérations ci-dessus utilisent toutes des commandes Redis communes pour obtenir un filtrage et un tri rapides et concis des messages, qui peuvent répondre à des exigences système relativement simples et peuvent également être étendues et optimisées pour des scénarios complexes.

3. Résumé

La mise en œuvre de la file d'attente prioritaire par Redis est une technologie très utile dans le développement réel, nous pouvons l'utiliser pour implémenter la planification des tâches, le filtrage des messages et d'autres fonctions afin d'améliorer les performances et la fiabilité du système. Grâce à l'introduction de cet article, nous avons découvert les principes de mise en œuvre de base et les exemples d'application de la file d'attente prioritaire Redis, et espérons aider les lecteurs à mieux maîtriser et appliquer ces connaissances.

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