Redis sur la réalisation élégante des tâches retardées

Mb6140060e201b0 2021-09-15 05:49:48
redis sur la alisation gante


 

 

Qu'est - ce qu'une tâche retardée

Tâches retardées,Comme son nom l'indique,C'est une tâche à accomplir après un certain délai.Par exemple,,Supposons que nous ayons une fonction de publication d'informations,Les opérations doivent être effectuées tous les matins7 Publier l'information à temps , Mais le matin 7Tout le monde n'est pas encore au travail,À ce moment - là, il est possible d'utiliser la tâche Delay pour mettre en oeuvre la publication Delay de l'information.Il suffit de préciser l'heure à laquelle l'information doit être envoyée le lendemain avant le quart précédent,L'information sera envoyée à l'heure prévue le lendemain.Si tout le monde avait un numéro public,Vous saurez que l'arrière - plan du numéro public a également la fonction d'envoyer régulièrement des articles.En résumé,L'utilisation des tâches retardées est encore très répandue.Sur la façon dont les tâches retardées sont mises en œuvre,Ce que je sais, c'est que3Espèce, On en reparlera plus tard. ,Aujourd'hui, expliquez commentredis Mise en œuvre des tâches retardées .

 

Caractéristiques des tâches retardées

Avant la présentation des programmes spécifiques,On pourrait penser à mettre en place un système de temporisation, Ce qui doit être sauvegardé Stocké (Le stockage ici ne signifie pas nécessairement la persistance,Ou en mémoire,Selon l'importance de la tâche retardée).La première chose à stocker est Description de la tâche .Si la tâche de retard que vous devez traiter est de retarder la publication de l'information,Donc vous devez au moins stocker des informationsidC'est parti..En plus, Si vous avez plusieurs Type de tâche,Par exemple,: Message push retardé 、Données de nettoyage retardées, etc,Alors vous devez aussi stocker le type de tâche. Total ci - dessus ,Tout appartient à la description de tâche.En plus de ça,, Vous devez également stocker Point d'exécution de la tâcheC'est parti.,En général, c'est l'horodatage.En outre,Nous devons également trier les tâches en fonction de leur temps d'exécution,Parce qu'il peut y avoir beaucoup de tâches dans la file d'attente des tâches retardées, Seules les tâches qui arrivent à un point dans le temps devraient être exécutées ,Le tri du temps d'exécution des tâches doit donc être pris en charge.

 

UtiliserRedis Mise en œuvre des tâches retardées

Ce sont les éléments nécessaires pour un système de tâches retardées.Retourredis, Quelles structures de données peuvent stocker à la fois les descriptions de tâches , Peut également stocker le temps d'exécution des tâches , Peut également être trié en fonction du temps d'exécution de la tâche ?J'y pense.,Il ne semble y avoir queSorted SetC'est.Nous pouvons séquencer la description de la tâche en chaîne,Mettez - le surSorted SetDevalueMoyenne, Et l'horodatage d'exécution de la tâche score,UtilisationSorted Set Propriétés de tri naturelles , Plus tôt le temps d'exécution est avancé .C'est comme ça., Il suffit d'ouvrir un ou plusieurs fils de synchronisation , Vérifie ça de temps en temps. Sorted SetMoyennescore Élément inférieur ou égal à l'horodatage actuel (Ça peut passer parzrangebyscoreRéalisation des commandes), Ensuite, exécutez la tâche correspondant à l'élément. .Bien sûr.,Après l'exécution de la tâche, De plus, les éléments Sorted SetSupprimer, Éviter la répétition des tâches . S'il y a plus d'un thread pour sonder ceci Sorted Set, Et envisager la concurrence , Si une Mission expire , Plusieurs fils l'ont eu. ,Vous devez vous assurer qu'un seul thread peut effectuer cette tâche à ce moment - là,Ça peut passer parzremCommande pour implémenter, Seule la suppression a réussi , Pour exécuter la tâche ,Cela garantit que la tâche n'est pas répétée par plus d'une tâche.

 

Regardez le Code.. Regardez d'abord la structure du projet. :

 Réalisation élégante des tâches retardées RedisArticles_Pool de Threads

Total4Catégories:ConstantsClasse définieRedis key Constante associée .DelayTaskConsumer Est un consommateur de tâches retardées , Cette classe est responsable de Redis Retrait des tâches expirées , Et encapsule la logique de la consommation de tâches .DelayTaskProducer Est le producteur de tâches retardées , Utilisé principalement pour mettre des tâches retardées à RedisMoyenne.RedisClientOui.Redis Classes d'outils pour les clients .

La classe principale est DelayTaskConsumerEtDelayTaskProducerC'est.

Commençons par le producteur. DelayTaskProducer:

 

public class DelayTaskProducer {    public void produce(String newsId,long timeStamp){        Jedis client = RedisClient.getClient();        try {            client.zadd(Constants.DELAY_TASK_QUEUE,timeStamp,newsId);        }finally {            client.close();        }    } }

Le Code est simple, Est de décrire la tâche (Pour plus de commodité, Il n'y a que des informations ici. id) Et l'horodatage de l'exécution des tâches RedisDeSorted SetMoyenne.

Ensuite, le consommateur qui retarde la tâche DelayTaskConsumer:

public class DelayTaskConsumer {    private ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();    public void start(){        scheduledExecutorService.scheduleWithFixedDelay(new DelayTaskHandler(),1,1, TimeUnit.SECONDS);    }    public static class DelayTaskHandler implements Runnable{        @Override        public void run() {            Jedis client = RedisClient.getClient();            try {                Set<String> ids = client.zrangeByScore(Constants.DELAY_TASK_QUEUE, 0, System.currentTimeMillis(),                        0, 1);                if(ids==null||ids.isEmpty()){                    return;                }                for(String id:ids){                    Long count = client.zrem(Constants.DELAY_TASK_QUEUE, id);                    if(count!=null&&count==1){                        System.out.println(MessageFormat.format(" Publier des informations .id - {0} , timeStamp - {1} , " +                                "threadName - {2}",id,System.currentTimeMillis(),Thread.currentThread().getName()));                    }                }            }finally {                client.close();            }        }    } }

Regardez d'abord.startMéthodes. Dans cette approche, nous utilisons JavaDeScheduledExecutorService Un pool de Threads de programmation est ouvert , Ce pool de Threads sera utilisé tous les 1 Second Schedule DelayTaskHandlerDansrunMéthodes.

DelayTaskHandler La classe est une logique de programmation concrète .Principalement:2Étapes, L'un est de Redis Sorted Set Retrait des tâches de retard expirées , L'autre est d'exécuter la tâche de retard due . La tâche de délai de retrait expire par zrangeByScore Commande implémentée , Le problème de la concurrence multithreadée est résolu en zrem Commande implémentée . Le Code n'est pas compliqué. , Il n'y a pas beaucoup d'explications ici. .

Ensuite, testez - le.:

public class DelayTaskTest {    public static void main(String[] args) {        DelayTaskProducer producer=new DelayTaskProducer();        long now=new Date().getTime();        System.out.println(MessageFormat.format("start time - {0}",now));        producer.produce("1",now+ TimeUnit.SECONDS.toMillis(5));        producer.produce("2",now+TimeUnit.SECONDS.toMillis(10));        producer.produce("3",now+ TimeUnit.SECONDS.toMillis(15));        producer.produce("4",now+TimeUnit.SECONDS.toMillis(20));        for(int i=0;i<10;i++){            new DelayTaskConsumer().start();        }    } }

Nous avons d'abord produit 4 Tâches retardées , Le temps d'exécution est respectivement après le début du programme 5Secondes、10Secondes、15Secondes、20Secondes, Et ça a commencé. 10 Délai de consommation des consommateurs .Les effets de fonctionnement sont les suivants:

 Réalisation élégante des tâches retardées RedisArticles_Traitement des tâches_02

Je vois.,Les tâches peuvent effectivement être exécutées à un moment ou à un autre, Mais il y a une petite erreur de temps. ,C'est parce que nous tirons les tâches d'expiration par des tâches programmées au lieu de les pousser en temps réel, Et il y a une partie des frais généraux du Réseau pour tirer la tâche ,Encore une fois,, Notre logique de traitement des tâches est synchrone , La tâche précédente doit être terminée. , Pour tirer le prochain lot de tâches ,Tous ces facteurs peuvent entraîner des retards dans l'exécution des tâches.

Résumé

C'est par là.Redis L'idée de réaliser la tâche de retard . Voici une version simple , En fait, il y a beaucoup de choses à optimiser .Par exemple,,Nous pouvons mettre la logique de traitement des tâches dans un pool de Threads séparé pour l'exécution,De cette façon, le consommateur de tâches n'a qu'à s'occuper de l'ordonnancement des tâches, L'avantage est que vous pouvez réduire les délais d'exécution des tâches .Et puis,C'est pour votre commodité., Description de la tâche id, S'il y a plusieurs types différents de tâches ,Comme nous l'avons mentionné précédemment, envoyer des tâches d'information et pousser des tâches de message,Ensuite, il faut distinguer par le type de tâche de stockage supplémentaire, Ou utiliser un autre Sorted Set Pour stocker les tâches retardées .

En plus de ça,, Dans l'exemple ci - dessus, chaque fois que vous tirez une tâche retardée , Tirez seulement. 1- Oui.,Si le nombre de tâches à accomplir à un moment donné est très élevé, Il y aura des retards importants dans certaines tâches. , Il peut être optimisé pour tirer plus que 1 Tâches expirées ,Par exemple,10- Oui., Et les traiter un par un , Cela peut grandement améliorer l'efficacité de l'ordonnancement , Parce que si vous utilisez la méthode ci - dessus ,Tirez!10 Tâches requises 10 Sous - programme ,Chaque intervalle1Secondes,Total des besoins10 Quelques secondes. 10 Retrait des tâches , S'il est tiré une fois à la place 10- Oui.,C'est tout.1 Ça sera fait en deux. , L'amélioration de l'efficacité est encore très importante .

Bien sûr, il peut être optimisé d'un autre point de vue . Regardez le code ci - dessus. , Lorsque la tâche à accomplir est retirée , Exécuter la tâche directement , Le thread sort après l'exécution de la tâche ,Mais à ce moment - là,, Il y a peut - être beaucoup de choses à faire dans la file d'attente. ( Parce que quand on prend la Mission, , Limite le nombre de tirages ), Donc, en fait, vous pouvez utiliser des boucles ici , Lorsque la tâche à accomplir n'est pas disponible , C'est la fin de l'expédition. , Quand il y a une tâche ,Après l'exécution et la requête incidente pour savoir s'il y a des tâches empilées, Terminer le thread jusqu'à ce qu'il n'y ait pas de tâche d'empilage .

La dernière chose à considérer est ,Le code ci - dessus ne traite pas des cas où l'exécution de la tâche a échoué, C'est - à - dire si une tâche échoue , Il n'y a aucune chance de réessayer. .Donc,, Lorsqu'il est utilisé dans un environnement de production , Il faut également tenir compte de l'échec du traitement des tâches. .Une façon simple est de saisir les exceptions pendant le traitement des tâches, Lorsqu'une exception se produit pendant le traitement , Remettez la tâche en place. Redis SortedMoyenne, Ou retry le traitement par le thread courant . Mais ce faisant, , La rapidité de la tâche n'est pas garantie. , C'était peut - être le matin. 7 Tâches exécutées par point , Raison de l'échec du retry ,Reporté à7Point10 Exécution partielle terminée , C'est un compromis d'affaires. ,Par exemple, le nombre de retraits peut être augmenté dans la description de la tâche ou le champ permettant les retraits, De cette façon, lorsque la tâche échoue ,Il est possible de prendre différentes mesures de compensation en fonction des différentes tâches.

Alors, utilisezredis Quels sont les avantages et les inconvénients de la mise en œuvre des tâches retardées? ? L'avantage est que le débit peut être atteint . L'inconvénient est le risque de perte de tâches (Quandredis Quand l'Instance est suspendue ).Donc,, Si les exigences de performance sont élevées , Tout en tolérant la perte de tâches dans quelques cas , Donc vous pouvez le faire de cette façon .

 Réalisation élégante des tâches retardées RedisArticles_Horodatage_03

版权声明
本文为[Mb6140060e201b0]所创,转载请带上原文链接,感谢
https://javamana.com/2021/09/20210914173523247L.html

  1. 互聯網Java工程師面試題,遇到的面試官都是架構師級別,
  2. 从入门到精通系列Java高级工程师路线介绍,拼多多三面惨败,
  3. 今年最新整理的《高频Java面试题集合》,2021Java通用流行框架大全,
  4. La dernière collection de questions d'entrevue Java haute fréquence organisée cette année, 2021 Java Universal Popular Framework
  5. De l'introduction à l'introduction de l'itinéraire de l'ingénieur principal Java de la série Mastering, il y a eu de nombreux échecs.
  6. JavaScript operator (1), Web Development Engineer
  7. Java simultané Programming Books recommended, half - Runner Java Program see me easy to Attack!
  8. Trier les questions d'entrevue Javascript, trier les points de connaissance des itinéraires d'apprentissage
  9. Xiaopeng P7, a high-value domestic electric car that can't be missed
  10. Song Mengjun's "sleepless night" triggered an upsurge of dance storm after 00
  11. Encapsulated PHP sends HTTP requests with curl. Get and post are very easy to use
  12. Recommend a lightweight and practical excellent Linux panel - wgcloud
  13. 从思维图到基础再到深入,记一次字节跳动Java研发岗的面试经历,
  14. 从底层开始带你了解并发编程,五步搞定Java开发环境部署,
  15. 从基础到源码统统帮你搞定,一招彻底帮你搞定HashMap源码,
  16. 從基礎到源碼統統幫你搞定,一招徹底幫你搞定HashMap源碼,
  17. De la base au code source pour vous aider à résoudre tout, un tour pour vous aider à résoudre complètement le code source hashtap,
  18. Commencez par le bas pour vous familiariser avec la programmation simultanée, et terminez le déploiement de l'environnement de développement Java en cinq étapes.
  19. De la carte de pensée à la base et à l'approfondissement, prenez note de l'expérience d'entrevue d'un octet sautant le poste de recherche et développement Java.
  20. Open source: Suzhou tourism strategy based on pyecharts visual analysis
  21. Good play | every character hates it. How does jade building spring do it?
  22. 從底層開始帶你了解並發編程,五步搞定Java開發環境部署,
  23. 以商品超卖为例讲解Redis分布式锁,一招彻底帮你搞定HashMap源码,
  24. 从青铜到王者的路线,2021Java者未来的出路在哪里?
  25. JavaScript Advanced Programming (3rd Edition) Reading note 6
  26. 從青銅到王者的路線,2021Java者未來的出路在哪裏?
  27. Quelle est la voie à suivre pour les 2021 Java du bronze au roi?
  28. Prenez l'exemple de la surproduction de marchandises pour expliquer redis Distributed Lock, un tour complet pour vous aider à résoudre le code source de hashtap,
  29. 以商品超賣為例講解Redis分布式鎖,一招徹底幫你搞定HashMap源碼,
  30. Win10系统 java环境配置
  31. Non-ASCII character ‘\xe5‘ in file kf1.py on line 4, but no encoding declared; see http://python.or
  32. 手把手教你搭建微信小程序服务器(HTTPS)
  33. JavaScript Review sketch - 1
  34. sqli-labs-less-18 http头user agent+报错注入
  35. Git下载、安装、配置、配合Intellij Idea实现代码版本控制
  36. NHibernate inheritance
  37. Summary of basic knowledge points of JavaScript language (mind map)
  38. GIT télécharge, installe, configure et implémente le contrôle de version de code avec intellij idea
  39. Sqli Labs - less - 18 http header user agent + Error Reporting Injection
  40. Vous apprendrez à construire un serveur d'applet Wechat (https) à la main
  41. Non - ASCII character 'xe5' in file kf1.py on Line 4, but no Encoding declared;Voirhttp://python.or
  42. 作为一名程序员我不忘初心,Java最新实习面试经验总结,
  43. 作为一名Java面试者你应该知道的,2021最新Java常用开源库总结,
  44. 作为一个程序员,你觉得最大的悲哀是什么,2021年大厂Java岗面试必问,
  45. Configuration de l'environnement Java du système win10
  46. 作為一個程序員,你覺得最大的悲哀是什麼,2021年大廠Java崗面試必問,
  47. En tant que programmeur, quelle est la plus grande tristesse que vous ressentez? L'entrevue d'emploi Java de 2021 dans une grande usine vous demandera:
  48. Comme vous devriez le savoir en tant qu'intervieweur Java, 2021 dernier résumé des bibliothèques open source couramment utilisées pour Java,
  49. En tant que programmeur, je n'oublie pas le dernier résumé de mon expérience d'entrevue de stage en Java.
  50. 作為一名Java面試者你應該知道的,2021最新Java常用開源庫總結,
  51. New feature of Java 8. Stream (). Map (general programming method: collect. Groupingby)
  52. Computer graduation project java + SSM hospital registration system
  53. 作為一名程序員我不忘初心,Java最新實習面試經驗總結,
  54. 使用Docker部署Spring-Boot项目,论程序员成长的正确姿势,
  55. Conseils pour améliorer l'efficacité du Code Java mille fois
  56. 全网首发,我在华为做Java外包的真实经历!
  57. 全套Java视频百度云,终于找到一个看得懂的JVM内存模型了,
  58. Docker tutorial series (I) introduction to docker tutorial spring cloud mybatis distributed microservice Cloud Architecture
  59. 全網首發,我在華為做Java外包的真實經曆!
  60. Run around with money? Li Weijia fell into the storm of endorsement! In the face of collective hot discussion, personal attitude has become the focus of attention