


Intervieweur?: Comment résoudre les biais de données Redis, les points chauds et d'autres problèmes
Aug 15, 2023 pm 04:43 PMRedis, en tant que technologie grand public, a de nombreux scénarios d'application. De nombreux entretiens avec des usines de grande, moyenne et petite taille l'ont répertorié comme un contenu clé de l'inspection
Il y a quelques jours, alors qu'un ami de Planet étudiait, il l'a rencontré. les questions suivantes et suis venu consulter Tom
Considérant que ces problèmes sont relativement fréquents et souvent rencontrés au travail, je vais écrire un article pour les expliquer systématiquement
Description du problème:
Vous poser la question. : J'ai quelques questions lors de l'examen de Redis, veuillez y jeter un ?il?:
Si le cluster Redis présente des données asymétriques et une distribution inégale des données, comment le résoudre??
Lors du traitement du raccourci clavier, créez plusieurs copies de la clé, telles que k-1, k-2..., Comment faire en sorte que ces copies écrivent uniformément?? Comment accéder uniformément ?
redis utilise un emplacement de hachage pour maintenir le cluster. Semblable au hachage cohérent, une migration complète peut être évitée. Pourquoi ne pas simplement utiliser un hachage cohérent??
Réponse?:
En tant qu'accélérateur de performances, le cache distribué joue un r?le très important dans l'optimisation du système. Par rapport au cache local, bien qu'il ajoute une transmission réseau et prenne moins d'1 milliseconde, il présente l'avantage d'une gestion centralisée et prend en charge une très grande capacité de stockage.
Dans le domaine du cache distribué, Redis est actuellement largement utilisé. Ce framework est un stockage en mémoire pur, une exécution de commandes monothread, des structures de données sous-jacentes riches et une prise en charge du stockage de données et de la recherche dans plusieurs dimensions.
Bien s?r, avec une grande quantité de données, divers problèmes surviennent, tels que?: le biais de données, les points chauds de données, etc.
Qu'est-ce que le biais de données??
La configuration matérielle d'une seule machine a une limite supérieure. Généralement, nous utiliserons une architecture distribuée pour former un cluster de plusieurs machines. Le cluster dans l'image ci-dessous est composé de trois machines autonomes Redis. Le client transmet les demandes de lecture et d'écriture à des instances spécifiques via une certaine stratégie de routage.
En raison de la particularité des données métier, selon les règles de partitionnement spécifiées, les données sur différentes instances peuvent être inégalement réparties. Une grande quantité de données est concentrée sur un ou plusieurs n?uds de machine pour le calcul, ce qui entra?ne une charge importante. ces n?uds l'ont fait tandis que d'autres n?uds attendent inactifs, ce qui entra?ne une faible efficacité globale.
Quelles sont les raisons du biais des données??
1. Il existe une grande clé
Par exemple, stocker une ou plusieurs données bigKey de type String prend beaucoup de mémoire.
Frère Tom a déjà étudié ce problème afin d'éviter des problèmes lors du développement, un collègue a utilisé le format JSON pour fusionner plusieurs données commerciales en une seule valeur et n'a associé qu'une seule clé. la paire a atteint des centaines de M.
La lecture et l'écriture fréquentes de clés volumineuses consomment de lourdes ressources mémoire et exercent une forte pression sur la transmission réseau, ce qui à son tour ralentit la réponse à la demande, déclenche un effet d'avalanche et finalement provoque diverses alarmes d'expiration du système.
Solution :
La méthode est très simple, utilisez <code style='font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace;background-color: rgba(0, 0, 0, 0.06);border-width: 1px;border-style: solid;border-color: rgba(0, 0, 0, 0.08);border-radius: 2px;padding-right: 2px;padding-left: 2px;'><span style="font-size: 16px;">化整為零</span>
的策略,將一個bigKey拆分為多個小key,獨立維護(hù),成本會降低很多。當(dāng)然這個拆也講究些原則,既要考慮業(yè)務(wù)場景也要考慮訪問場景,將關(guān)聯(lián)緊密的放到一起。
比如:有個RPC接口內(nèi)部對 Redis 有依賴,之前訪問一次就可以拿到全部數(shù)據(jù),拆分將要控制單值的大小,也要控制訪問的次數(shù),畢竟調(diào)用次數(shù)增多了,會拉大整體的接口響應(yīng)時間。
浙江的政府機(jī)構(gòu)都在提倡優(yōu)化流程,最多跑一次,都是一個道理。
2、HashTag 使用不當(dāng)
Redis 采用單線程執(zhí)行命令,從而保證了原子性。當(dāng)采用集群部署后,為了解決mset、lua 腳本等對多key 批量操作,為了保證不同的 key 能路由到同一個 Redis 實例上,引入了 HashTag 機(jī)制。
用法也很簡單,使用<span style="font-size: 16px;">{}</span>
le diviser en plusieurs partiesLa stratégie consiste à diviser une bigKey en plusieurs petites clés et à les maintenir indépendamment, ce qui réduira considérablement le co?t. Bien entendu, ce démontage tient également compte de certains principes. Il est nécessaire de considérer à la fois les scénarios commerciaux et les scénarios d'accès, et de les rapprocher.
Par exemple?: il existe une interface RPC qui a une dépendance interne à Redis. Auparavant, toutes les données pouvaient être obtenues en y accédant une fois. Le fractionnement contr?lerait la taille de la valeur unique et le nombre d'accès. , l'augmentation du nombre d'appels entra?nera un problème de temps de réponse global important de l'interface.
2. Utilisation inappropriée de HashTag
????????Redis utilise un seul thread pour exécuter les commandes, garantissant ainsi atomicité. Lorsque le déploiement de cluster est adopté, afin de résoudre les opérations par lots multi-clés telles que les scripts mset et lua, et de garantir que différentes clés peuvent être acheminées vers la même instance Redis, Mécanisme HashTag ??. ????????L'utilisation est également très simple, utilisez ?? ?? {}??
??Accolades, spécifiez la clé pour calculer uniquement le hachage de la cha?ne entre les accolades, insérant ainsi des paires clé-valeur de clés différentes dans le même emplacement de hachage. ??????????Par exemple?: ????????192.168.0.1:6380> CLUSTER KEYSLOT testtag (integer) 764 192.168.0.1:6380> CLUSTER KEYSLOT {testtag} (integer) 764 192.168.0.1:6380> CLUSTER KEYSLOT mykey1{testtag} (integer) 764 192.168.0.1:6380> CLUSTER KEYSLOT mykey2{testtag} (integer) 764??????Vérifiez le code d'entreprise pour voir si HashTag est introduit et si trop de clés sont acheminées vers une seule instance. Considérez comment diviser en fonction de scénarios spécifiques. ????????Tout comme RocketMQ, dans de nombreux cas, nos besoins professionnels peuvent être satisfaits tant que les partitions sont maintenues en ordre. Dans la pratique, nous devons trouver ce point d’équilibre, plut?t que de résoudre les problèmes pour le simple plaisir de les résoudre. ????
3. Répartition inégale des emplacements
Si la méthode de déploiement Redis Cluster est adoptée, la base de données du cluster est divisée en 16384 emplacements (slots), et chaque clé de la base de données appartient à ces 16384 emplacements. , chaque n?ud du cluster peut gérer 0 ou un maximum de 16 384 emplacements.
Vous pouvez migrer manuellement un emplacement relativement grand vers une machine légèrement inactive pour garantir l'uniformité du stockage et de l'accès.
Que sont les hotspots de cache??
Le point d'accès du cache signifie que la plupart, voire toutes les demandes commerciales touchent les mêmes données mises en cache, ce qui exerce une pression énorme sur le serveur de cache et dépasse même la limite de charge d'une seule machine, provoquant une panne du serveur.
Solution?:
1. Faites plusieurs copies
Nous pouvons épeler des nombres séquentiels derrière la clé, tels que clé n°01, clé n°02. . . Plusieurs copies de la clé n°10, ces clés traitées sont situées sur plusieurs n?uds de cache.
Chaque fois que le client accède, il lui suffit de combiner un nombre aléatoire avec la limite supérieure du nombre de fragments en fonction de la clé d'origine et d'acheminer la demande vers des n?uds d'instance qui ne peuvent pas être acheminés.
Remarque?: Le cache définit généralement un délai d'expiration afin d'éviter une défaillance du cache centralisé, nous essayons de ne pas avoir le même délai d'expiration du cache. Nous pouvons ajouter un nombre aléatoire basé sur le préréglage.
Quant à l'uniformité du routage des données, elle est garantie par l'algorithme de Hash.
2. Cache de mémoire locale
Cache les données du hotspot dans la mémoire locale du client et définit un délai d'expiration. Pour chaque requête de lecture, il vérifiera d'abord si la donnée existe dans le cache local. Si elle existe, elle sera renvoyée directement. Si elle n'existe pas, elle accédera ensuite au serveur de cache distribué.
La mémoire cache locale "libère" complètement le serveur de cache et n'exerce aucune pression sur le serveur de cache.
Inconvénients?: Il est un peu difficile de détecter les dernières données mises en cache en temps réel, et des incohérences des données peuvent survenir. Nous pouvons définir un délai d'expiration relativement court et utiliser des mises à jour passives. Bien entendu, vous pouvez également utiliser un mécanisme de surveillance pour mettre à jour le cache local en temps opportun s'il détecte que les données ont changé.
Redis Cluster 為什么不用一致性Hash?
Redis Cluster 集群有16384個哈希槽,每個<code style='font-family: SFMono-Regular, Consolas, "Liberation Mono", Menlo, Courier, monospace;background-color: rgba(0, 0, 0, 0.06);border-width: 1px;border-style: solid;border-color: rgba(0, 0, 0, 0.08);border-radius: 2px;padding-right: 2px;padding-left: 2px;'><span style="font-size: 16px;">key</span>
通過<span style="font-size: 16px;">CRC16</span>
校驗后對<span style="font-size: 16px;">16384</span>
取模來決定放置哪個槽。集群的每個節(jié)點負(fù)責(zé)一部分hash槽,舉個例子,比如當(dāng)前集群有3個節(jié)點,那么 <span style="font-size: 16px;">node-1</span>
包含 0 到 5460 號哈希槽,<span style="font-size: 16px;">node-2</span>
包含 5461 到 10922 號哈希槽,<span style="font-size: 16px;">node-3</span>
key
<p style="min-height: 24px;margin-bottom: 24px;">CRC16<br></p>

<p style="min-height: 24px;margin-bottom: 24px;">16384<br></p>
取模來決定放置哪個槽。集群的每個節(jié)點負(fù)責(zé)一部分hash槽,舉個例子,比如 0 到 5460 號哈希槽,
<p style="min-height: 24px;margin-bottom: 24px;">node-2<span style="color: rgb(0, 0, 0);font-size: 16px;"></span></p>
包含 5461 到 10922 號哈希槽,<section data-tool="mdnice編輯器" data-website="https://www.mdnice.com" style='font-size: 16px;color: black;padding-right: 10px;padding-left: 10px;line-height: 1.6;letter-spacing: 0px;text-align: left;word-break: break-all;font-family: Optima-Regular, Optima, PingFangSC-regular, PingFangTC-regular, "PingFang SC", Cambria, Cochin, Georgia, Times, "Times New Roman", serif;margin-bottom: 24px;'>node-3<blockquote data-tool="mdnice編輯器" style="border-top: none;border-right: none;border-bottom: none;font-size: 0.9em;overflow: auto;color: rgb(106, 115, 125);padding: 10px 10px 10px 20px;margin-bottom: 20px;margin-top: 20px;background: rgb(249, 249, 249);border-left-color: rgb(92, 157, 255);"></blockquote></section>
包含 ?到 16383 號哈希槽。
一致性哈希算法是1997年麻省理工學(xué)院的 Karger 等人提出了,為的就是解決分布式緩存的問題。
L'algorithme de hachage cohérent atténue considérablement le problème de défaillance du cache causé par l'expansion ou le rétrécissement et n'affecte que le petit segment de clés dont ce n?ud est responsable. S'il n'y a pas beaucoup de machines dans le cluster et que le niveau de charge d'une seule machine est généralement très élevé, la pression provoquée par le temps d'arrêt d'un certain n?ud peut facilement déclencher un effet d'avalanche.
Par exemple?:
Le cluster Redis compte un total de 4 machines En supposant que les données soient réparties uniformément, chaque machine supporte un quart du trafic si une certaine machine arrive soudainement. se bloque, la machine suivante dans le sens des aiguilles d'une montre supportera le quart de trafic supplémentaire, et éventuellement la moitié du trafic, ce qui fait encore un peu peur.
Mais si vous utilisez <span style="font-size: 16px;">CRC16</span>
CRC16 Après le calcul, combiné à la relation de liaison entre les slots et les instances, qu'il s'agisse d'une extension ou d'une réduction, seule la clé du n?ud correspondant doit être migrée en douceur, et la nouvelle relation de mappage de slot sera diffusée et stockée sans générant une invalidation du cache, une grande flexibilité.
De plus, s'il existe des différences dans les configurations des n?uds de serveur, nous pouvons personnaliser les numéros d'emplacement attribués aux différents n?uds et ajuster les capacités de charge des différents n?uds, ce qui est très pratique.
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!

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
échangez les visages dans n'importe quelle vidéo sans effort grace à notre outil d'échange de visage AI entièrement gratuit?!

Article chaud

Outils chauds

Bloc-notes++7.3.1
éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Pour gérer correctement les transactions JDBC, vous devez d'abord désactiver le mode de validation automatique, puis effectuer plusieurs opérations, et enfin vous engager ou randonner en fonction des résultats; 1. Appelez Conn.SetAutoCommit (false) pour démarrer la transaction; 2. Exécuter plusieurs opérations SQL, telles que l'insertion et la mise à jour; 3. Appelez Conn.Commit () Si toutes les opérations sont réussies, et appelez Conn.Rollback () Si une exception se produit pour garantir la cohérence des données; Dans le même temps, les ressources TRY-With doivent être utilisées pour gérer les ressources, gérer correctement les exceptions et cl?turer les connexions pour éviter la fuite de connexion; De plus, il est recommandé d'utiliser des pools de connexion et de définir des points de sauvegarde pour réaliser un retour en arrière partiel, et de maintenir les transactions aussi courtes que possible pour améliorer les performances.

Utilisez des classes dans le package Java.Time pour remplacer les anciennes classes de date et de calendrier; 2. Obtenez la date et l'heure actuelles via LocalDate, LocalDateTime et Localtime; 3. Créez une date et une heure spécifiques en utilisant la méthode OF (); 4. Utilisez la méthode plus / moins pour augmenter et diminuer le temps; 5. Utilisez ZonedDateTime et ZoneID pour traiter le fuseau horaire; 6. Format et cha?nes de date d'analyse via DateTimeFormatter; 7. Utilisez instantanément pour être compatible avec les anciens types de dates si nécessaire; Le traitement des dattes dans le Java moderne devrait donner la priorité à l'utilisation de Java.timeapi, qui fournit clairement, immuable et linéaire

Pré-formancetartuptimemoryusage, quarkusandmicronautleadduetocompile-timeprocessingandgraalvsupport, withquarkusofperforming lightbetterine scénarios.

NetworkportsandfirewallsworkTogeTherToenable Communication whileSenSurringSecurity.1.networkportsAreVirtualEndpointsNumberred0–65535, Withwell-connuportslike80 (HTTP), 443 (HTTPS), 22 (SSH), et 25 (SMTP)

La collecte des ordures de Java (GC) est un mécanisme qui gère automatiquement la mémoire, ce qui réduit le risque de fuite de mémoire en récupérant des objets inaccessibles. 1. GC juge l'accessibilité de l'objet de l'objet racine (tel que les variables de pile, les threads actifs, les champs statiques, etc.), et les objets inaccessibles sont marqués comme des ordures. 2. Sur la base de l'algorithme de compensation de marque, marquez tous les objets accessibles et effacez des objets non marqués. 3. Adopter une stratégie de collecte générationnelle: la nouvelle génération (Eden, S0, S1) exécute fréquemment MinorGC; Les personnes agées fonctionnent moins, mais prend plus de temps pour effectuer MajorGC; Metaspace Stores Metadata de classe. 4. JVM fournit une variété de périphériques GC: SerialGC convient aux petites applications; Le parallelGC améliore le débit; CMS réduit

Le choix du bon type HTMLinput peut améliorer la précision des données, améliorer l'expérience utilisateur et améliorer la convivialité. 1. Sélectionnez les types d'entrée correspondants en fonction du type de données, tels que le texte, le courrier électronique, le tel, le numéro et la date, qui peuvent vérifier automatiquement la somme de la somme et l'adaptation au clavier; 2. Utilisez HTML5 pour ajouter de nouveaux types tels que l'URL, la couleur, la plage et la recherche, qui peuvent fournir une méthode d'interaction plus intuitive; 3. Utilisez l'espace réservé et les attributs requis pour améliorer l'efficacité et la précision du remplissage des formulaires, mais il convient de noter que l'espace réservé ne peut pas remplacer l'étiquette.

GradleisthebetterChoiceFormostNewProjectsDuetOtsSuperiorflexibility, Performance et ModerNtoolingSupport.1.gradle’sgroovy / kotlindslismoreConcis

Le report est utilisé pour effectuer des opérations spécifiées avant le retour de la fonction, telles que les ressources de nettoyage; Les paramètres sont évalués immédiatement lorsqu'ils sont reportés et les fonctions sont exécutées dans l'ordre de la dernière entrée (LIFO); 1. Plusieurs éleveurs sont exécutés dans l'ordre inverse des déclarations; 2. Communément utilisé pour le nettoyage sécurisé tel que la fermeture des fichiers; 3. La valeur de retour nommée peut être modifiée; 4. Il sera exécuté même si la panique se produit, adaptée à la récupération; 5. éviter l'abus de report dans les boucles pour éviter la fuite des ressources; Une utilisation correcte peut améliorer la sécurité et la lisibilité du code.
