Maison > base de données > Redis > le corps du texte

Trois méthodes de stratégie de suppression Redis et analyse d'exemples d'algorithmes d'expulsion

PHPz
Libérer: 2023-06-02 13:43:34
avant
1519 Les gens l'ont consulté

1. Préface

Avant de commencer l'article, laissez-moi vous poser une question : Lorsque nous utilisons la commande : expire key second给一个key设置过期时间,过期时间一到,这个key对应的过期数据Est-elle vraiment supprimée immédiatement par le serveur ? La réponse est qu’il ne sera pas supprimé immédiatement. Connaissant cette réponse, examinons comment les données expirées sont traitées dans Redis.

2. Caractéristiques des données dans Redis

Redis est une base de données au niveau de la mémoire. Toutes les données sont stockées dans la mémoire. Les données dans la mémoire peuvent obtenir leur statut via des instructions TTL :

. Résultat de la commandeStatutXXDonnées temporelles-1Données valides en permanence-2Données expirées ou données supprimées ou données non définies

3. Structure de stockage de données sensibles au temps

Trois méthodes de stratégie de suppression Redis et analyse dexemples dalgorithmes dexpulsion

Lorsque nous utilisons des instructions pour définir des données expirées, l'adresse correspondant aux données sera placée dans l'espace d'expiration. La méthode de stockage est le hachage et la valeur stockée est l'expiration. temps.

4. Stratégie de suppression de données

Objectif de la stratégie de suppression de données :Trouver un équilibre entre l'utilisation de la mémoire et l'utilisation du processeur. Ne pas se soucier de l'un ou de l'autre entraînera une diminution des performances globales de Redis, voire une diminution. provoquer un temps d'arrêt du serveur ou une fuite de mémoire 数据删除策略目标:在内存占用与CPU占用之间寻找一种平衡,顾此失彼都会造成整体redis性能的下降,甚至引发服务器宕机或内存泄露

1、定时删除

  • 创建一个定时器,当key设置有过期时间,且过期时间到达时,由定时器任务立即执行对键的删除操作

  • 优点:节约内存,到时就删除,快速释放掉不必要的内存占用

  • 缺点:CPU压力很大,无论CPU此时负载量多高,均占用CPU,会影响redis服务器响应时间和指令吞吐量

Trois méthodes de stratégie de suppression Redis et analyse dexemples dalgorithmes dexpulsion

2、惰性删除

  • 数据到达过期时间,不做处理。等下次访问该数据时,会调用expireIfNeeded()函数来判断该数据是否过期: 如果未过期,返回数据,发现已过期,删除,返回不存在

  • 优点:节约CPU性能,发现必须删除的时候才删除

  • 缺点:内存压力很大,出现长期占用内存的数据

Trois méthodes de stratégie de suppression Redis et analyse dexemples dalgorithmes dexpulsion

3、定期删除

Trois méthodes de stratégie de suppression Redis et analyse dexemples dalgorithmes dexpulsion

流程分析:

  • Redis服务器启动初始化时,读取配置server.hz的值,默认为10

  • 然后每秒钟执行10次serverCron()方法,该方法用来检测服务器

  • serverCron()方法又会调用databasesCron()方法,该方法是用来遍历数据库的,redis默认有16个数据库,从第一个数据库开始

  • databasesCron()方法又会调用activeExpireCycle()方法,该方法会对每一个expires[*]逐一进行检测,每次执行250ms/server.hz;对某个expires[*]检测时,随机挑选W个key检测

  • 如果检测到key超时,则删除key;如果一轮中删除的key的数量>W25%,循环该过程;如果一轮中删除的key的数量≤W25%,检查下一个expires[*],0-15循环。其中W取值=ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP属性值

  • 如果activeExpireCycle()执行时间到期,下次从current_db继续向下执行

  • 参数current_db用于记录activeExpireCycle() 进入哪个expires[*] 执行

Trois méthodes de stratégie de suppression Redis et analyse dexemples dalgorithmes dexpulsion

  • 总结:

    1. Suppression programmée

    • Créez une minuterie lorsque la clé est définie pour avoir un délai d'expiration. le délai d'expiration est atteint, la tâche du minuteur effectuera immédiatement les opérations de suppression de clé
    • Avantages : Économisez de la mémoire, supprimez le moment venu et libérez rapidement l'utilisation inutile de la mémoire

    Inconvénients :Pression du processeur Elle est très importante. Quelle que soit la charge du processeur à ce moment-là, elle occupera le processeur, ce qui affectera le temps de réponse du serveur Redis et le débit des instructionsTrois méthodes de stratégie de suppression Redis et analyse d'exemples d'algorithmes d'expulsionAvantages :Enregistrez les performances du processeur, supprimez uniquement lorsque vous estimez qu'il est nécessaire de supprimer

    3. Suppression régulière

    Trois méthodes de stratégie de suppression Redis et d'algorithme d'expulsion Exemple d'analyse
    Lorsque le serveur Redis démarre et initialise, lisez la valeur de la configuration server.hz, la valeur par défaut est 10 Ensuite, la méthode serverCron() est exécutée 10 fois par seconde, qui est utilisée pour détecter le serveur

    2. Suppression paresseuse

      Les données atteignent le délai d'expiration et ne seront pas traitées. Lors du prochain accès aux données, la fonction expireIfNeeded() sera appelée pour déterminer si les données ont expiré : si elles n'ont pas expiré, renvoyez les données, trouvez qu'elles ont expiré, supprimez-les et le retour n'existe pas
      Inconvénients :Pression élevée de la mémoire, données qui prend de la mémoire pendant longtemps apparaît Trois méthodes de suppression de Redis stratégie et analyse d'exemples d'algorithmes d'expulsion
      Analyse du processus :
      🎜La méthode serverCron() appellera à son tour la méthode databasesCron(), cette méthode est utilisée pour parcourir la base de données Redis a 16 bases de données par défaut, à partir de la. la première méthode database🎜🎜🎜🎜databasesCron() appellera la méthode activeExpireCycle(), cette méthode détectera chaque expire[*] un par un , exécutant 250ms/server.hz ​​​​à chaque fois ; pendant un certain expire[* ] Pendant la détection, sélectionnez au hasard les clés W pour la détection🎜🎜🎜🎜Si le délai d'expiration de la clé est détecté, supprimez la clé ; si le nombre de clés supprimées en un tour > W25%, bouclez le processus ; si en un tour le nombre de clés supprimées est expire[*], 0-15 cycle. . Parmi eux, la valeur de l'attribut W = ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP🎜🎜🎜🎜Si le temps d'exécution de activeExpireCycle() expire, l'exécution continuera à partir de current_db la prochaine fois🎜🎜🎜🎜Le paramètre current_db est utilisé pour enregistrer ce qui expire[*] activeExpireCycle () entre pour exécution🎜🎜 🎜🎜Trois méthodes de stratégie de suppression Redis et analyse de Exemples d'algorithmes d'expulsion 🎜
        🎜🎜Résumé : Interrogez périodiquement les données opportunes dans la bibliothèque Redis, adoptez une stratégie d'extraction aléatoire et utilisez la proportion des données expirées pour contrôler la fréquence de suppression 🎜🎜🎜🎜La pression mémoire n'est pas très élevée, les données froides qui occupent la mémoire depuis longtemps seront nettoyées en continu 🎜🎜🎜🎜 5. Comparaison des stratégies de suppression 🎜🎜🎜🎜🎜Suppression régulière 🎜🎜 économise de la mémoire, aucune occupation 🎜🎜 peu importe Les périodes occupent les ressources du processeur, haute fréquence🎜🎜Temps d'échange contre de l'espace🎜🎜🎜🎜Suppression paresseuse🎜🎜Utilisation importante de la mémoire🎜🎜Exécution retardée, utilisation élevée du processeur🎜🎜Echange d'espace contre du temps🎜🎜 🎜🎜Suppression régulière🎜🎜Mémoire Nettoyage aléatoire régulier🎜🎜dépense des ressources CPU fixes par seconde pour maintenir la mémoire🎜🎜vérifications ponctuelles aléatoires et ciblées🎜🎜🎜🎜

        6. Algorithme d'expulsion

        1. Introduction au concept

        Que faire si la mémoire est insuffisante lorsque de nouvelles données entrent dans Redis ? Redis utilise la mémoire pour stocker les données. Avant d'exécuter chaque commande, freeMemoryIfNeeded() sera appelé pour vérifier si la mémoire est suffisante. Si la mémoire ne répond pas aux exigences minimales de stockage pour les données nouvellement ajoutées, redis supprimera temporairement certaines données pour libérer de l'espace de stockage pour l'instruction en cours. La stratégie de nettoyage des données s’appelle l’algorithme d’expulsion. freeMemoryIfNeeded()检测内存是否充足。如果内存不满足新加入数据的最低存储要求,redis要临时删除一些数据为当前指令清理存储空间。清理数据的策略称为逐出算法。

        注意:逐出数据的过程不是100%能够清理出足够的可使用的内存空间,如果不成功则反复执行。当对所有数据尝试完毕后,如果不能达到内存清理的要求,将出现错误信息。

        Trois méthodes de stratégie de suppression Redis et analyse dexemples dalgorithmes dexpulsion

        2、八种配置

        检测易失数据(可能会过期的数据集server.db[i].expires

        volatile-lru 挑选最近最少使用的数据淘汰
        volatile-lfu 挑选最近使用次数最少的数据淘汰
        volatile-ttl 挑选将要过期的数据淘汰
        volatile-random 任意选择数据淘汰

        检测全库数据(所有数据集server.db[i].dict

        Remarque : Le processus d'expulsion des données n'est pas capable à 100 % de libérer suffisamment d'espace mémoire utilisable. S'il échoue, il sera exécuté à plusieurs reprises. Après avoir essayé toutes les données, si les exigences de nettoyage de la mémoire ne peuvent pas être satisfaites, un message d'erreur apparaîtra. Détecter les données volatiles (Ensemble de données server.db[i].expires qui peut expirer)volatile-lruSélectionnez l'élimination des données la moins récemment utiliséevolatile-lfuChoisissez les données les moins récemment utilisées à éliminer
        Trois méthodes de stratégie de suppression Redis et analyse d'exemples d'algorithmes d'expulsion 2. Huit configurations

        volatile-ttl

        Choisissez les données sur le point d'expirervolatile-randomChoisissez les données à éliminer
        🎜🎜 Détecter l'intégralité des données de la base de données (tous les ensembles de données server.db[i].dict)🎜🎜🎜🎜🎜allkeys-lru🎜🎜Sélectionner les données les moins récemment utilisées à éliminer🎜🎜🎜🎜allkeys- lfu 🎜🎜Choisissez les données les moins récemment utilisées pour l'élimination🎜🎜🎜🎜allkeys-random🎜🎜Toute sélection de données pour l'élimination🎜🎜🎜🎜🎜🎜abandonner l'expulsion des données : 🎜🎜🎜🎜🎜🎜no-enviction🎜 🎜 interdire l'expulsion des données (stratégie par défaut redis4 .0)🎜🎜🎜🎜

      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:yisu.com
      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!