Maison  >  Article  >  base de données  >  Résumé des questions d'entretien courantes sur Redis (avec analyse des réponses)

Résumé des questions d'entretien courantes sur Redis (avec analyse des réponses)

青灯夜游
青灯夜游avant
2021-04-08 10:29:182679parcourir

J'ai interviewé 6 grands fabricants et partagé avec vous un résumé des questions courantes d'entretien Redis qui ont été mal posées (avec réponses et analyse). Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère qu'il sera utile à tout le monde.

Résumé des questions d'entretien courantes sur Redis (avec analyse des réponses)

[Recommandations associées : Tutoriel vidéo Redis]

Mise en cache des points de connaissances

Quels sont les types de cache ?

La mise en cache est un moyen efficace d'améliorer les performances d'accès aux données des points d'accès dans des scénarios de concurrence élevée et est souvent utilisée lors du développement de projets.

Les types de cache sont divisés en : cache local, cache distribué et cache multi-niveaux.

Cache local :

Le cache local est mis en cache dans la mémoire du processus, comme notre Dans le tas JVM, vous pouvez utiliser LRUMap pour l'implémenter, ou vous pouvez utiliser des outils comme Ehcache pour l'implémenter.

Le cache local permet un accès à la mémoire, n'entraîne aucune surcharge d'interaction à distance et offre les meilleures performances. Cependant, il est limité par la capacité d'une seule machine. Généralement, le cache est petit et ne peut pas être étendu.

Cache distribué :

Cache distribué peut très bien résoudre ce problème.

Les caches distribués ont généralement une bonne évolutivité horizontale et peuvent gérer des scénarios avec de grandes quantités de données. L'inconvénient est que des requêtes à distance sont nécessaires et que les performances ne sont pas aussi bonnes que la mise en cache locale.

Cache multi-niveaux :

Afin d'équilibrer cette situation, dans les affaires réelles, cache multi-niveaux est généralement utilisé, local Le cache enregistre uniquement certaines données de hotspot avec la fréquence d'accès la plus élevée, et d'autres données de hotspot sont placées dans le cache distribué.

Parmi les fabricants actuels de premier rang, c'est également la solution de mise en cache la plus couramment utilisée. Une seule solution de mise en cache est souvent difficile à prendre en charge de nombreux scénarios à forte concurrence.

Stratégie d'élimination

Qu'il s'agisse d'un cache local ou d'un cache distribué, afin d'assurer des performances plus élevées, la mémoire est utilisée pour sauvegarder les données . Limitations de coût et de mémoire : lorsque les données stockées dépassent la capacité du cache, les données mises en cache doivent être expulsées.

Les stratégies générales d'élimination incluent FIFO pour éliminer les données les plus anciennes, LRU pour éliminer les données les moins récemment utilisées et LFU pour éliminer les moins récentes. données récemment utilisées.

  • noeviction : renvoie une erreur lorsque la limite de mémoire est atteinte et que le client tente d'exécuter une commande qui entraînerait l'utilisation de plus de mémoire (la plupart des commandes d'écriture, mais DEL et quelques exceptions)

  • allkeys-lru : Essayez de recycler les clés les moins utilisées (LRU) afin qu'il y ait de la place pour les données nouvellement ajoutées.

  • volatile-lru : Essayez de recycler les clés les moins utilisées (LRU), mais uniquement les clés de l'ensemble expiré, afin qu'il y ait de la place pour les données nouvellement ajoutées.

  • allkeys-random : recyclez les clés aléatoires pour libérer de l'espace pour les données nouvellement ajoutées.

  • volatile-random : recyclez les clés aléatoires pour libérer de l'espace pour les données nouvellement ajoutées, mais uniquement pour les clés de l'ensemble expiré.

  • volatile-ttl : Recyclez les clés de l'ensemble expiré, et donnez la priorité au recyclage des clés avec une durée de vie (TTL) plus courte, pour qu'il y ait de la place pour que les données nouvellement ajoutées soient stockées.

    Si aucune clé ne répond aux prérequis du recyclage, les stratégies volatile-lru, volatile-random et volatile-ttl s'apparentent à la noeviction .

En fait, l'algorithme Lru est également implémenté dans le familier LinkedHashMap L'implémentation est la suivante :

.

Lorsque la capacité dépasse 100, commencez à exécuter la stratégie LRU : supprimez l'objet TimeoutInfoHolder inutilisé le moins récemment expulsé.

Dans une vraie interview, il vous sera demandé d'écrire un algorithme LUR. Ne faites pas celui d'origine. C'est vraiment trop et vous ne pouvez pas le terminer. Vous pouvez soit faire celui ci-dessus, soit celui-là. un ci-dessous et trouvez une structure de données pour l'implémenter. Il est relativement facile de télécharger la version Java de LRU, à condition d'en connaître les principes.

Memcache

Notez que Memcache Appelé MC.

Jetons d'abord un coup d'œil aux caractéristiques de MC :

  • MC utilise des E/S asynchrones multithread lors du traitement des requêtes, ce qui peut raisonnablement tirer parti du processeur multicœur et offre d'excellentes performances
  • MC a des fonctions simples et utilise la mémoire pour stocker les données ;
  • Je n'entrerai pas dans les détails sur la structure de la mémoire de MC et les problèmes de calcification. Vous pouvez consulter le site officiel pour en savoir plus
  • MC peut définir une date d'expiration pour les données mises en cache et celles expirées. les données seront effacées ;
  • La stratégie d'invalidation adopte une invalidation retardée, qui consiste à vérifier si les données sont invalides lorsqu'elles sont à nouveau utilisées
  • Lorsque la capacité est pleine, les données dans le cache ; seront supprimées lors de la suppression, en plus de nettoyer les clés expirées, les données seront également éliminées conformément à la politique LRU.

De plus, il existe certaines restrictions sur l'utilisation de MC, qui sont très fatales dans le scénario Internet actuel. Elles sont devenues une raison importante pour laquelle tout le monde choisit Redis et . MongoDB :

  • la clé ne peut pas dépasser 250 octets ;
  • la valeur ne peut pas dépasser 1 M octets
  • Le délai d'expiration maximum de la clé est de 30 jours ; >
  • Prend uniquement en charge la structure K-V et ne fournit pas de fonctions de persistance et de synchronisation maître-esclave.

Redis

Parlons brièvement des caractéristiques de

Redis pour une comparaison facile avec MC.

    Différent de MC, Redis utilise le mode monothread pour traiter les requêtes. Il y a deux raisons à cela : l'une est qu'il utilise un mécanisme de traitement d'événements asynchrone non bloquant ; l'autre est que les données mises en cache sont toutes des opérations de mémoire et que le temps d'E/S ne sera pas trop long, et qu'un seul thread peut éviter le coût. de changement de contexte de thread.
  • Redis prend en charge la persistance, donc Redis peut être utilisé non seulement comme cache, mais également comme base de données NoSQL.
  • Par rapport à MC,
  • Redis présente également un très gros avantage, c'est-à-dire qu'en plus de K-V, il prend également en charge plusieurs formats de données, tels que liste, ensemble, ensemble trié, hachage, etc.
  • Redis fournit un mécanisme de synchronisation maître-esclave et une capacité de déploiement de cluster Cluster, qui peut fournir des services à haute disponibilité.

Explication détaillée de Redis

La structure des points de connaissance de Redis est présentée dans la figure ci-dessous.

Fonction

Voyons ce que

Redis fournit Quelles sont les fonctions de !

Regardons d'abord les types de base :

String :

String Le type est Le type le plus couramment utilisé dans Redis, l'implémentation interne est stockée via SDS (Simple Dynamic String). SDS est similaire à ArrayList en Java, ce qui peut réduire les allocations fréquentes de mémoire en pré-attribuant un espace redondant.

C'est le type le plus simple, juste un ensemble et une obtention ordinaires, effectuant une simple mise en cache KV.

Mais dans un environnement de développement réel, de nombreuses personnes peuvent convertir de nombreuses structures complexes en

String pour le stockage et l'utilisation. Par exemple, certaines personnes aiment convertir des objets ou des List. est converti en JSONString pour le stockage, puis retiré et désérialisé.

Je ne discuterai pas du bien ou du mal de faire cela ici, mais j'espère toujours que tout le monde pourra utiliser la structure de données la plus appropriée dans le scénario le plus approprié. L'objet ne peut pas être trouvé comme étant le plus approprié, mais le type peut être sélectionné. Eh bien, après que quelqu'un d'autre ait repris votre code, ils ont vu que c'était tellement

standard Hé, ce type a quelque chose. 🎜>Ficelle pour tout, Déchets !

D'accord, ce sont toutes des digressions. J'espère que tout le monde les gardera à l'esprit. Les habitudes deviennent naturelles et les petites habitudes font la réussite.

String

propose un large éventail de scénarios d'application pratiques :

  • Fonction cache : String

    la chaîne est la plus couramment utilisée Les types de données ne sont pas seulement Redis, chaque langage est le type le plus basique. Par conséquent, utilisez Redis comme cache, coopérez avec d'autres bases de données comme couche de stockage et utilisez Redis. La prise en charge d'une simultanéité élevée peut considérablement accélérer la vitesse de lecture et d'écriture du système et réduire la pression sur la base de données principale.

  • Compteur :

    De nombreux systèmes utiliseront Redis comme compteur en temps réel du système, qui peut rapidement mettre en œuvre des fonctions de comptage et de requête. Et les résultats finaux des données peuvent être stockés dans une base de données ou sur un autre support de stockage à un moment précis pour un stockage permanent.

  • Session utilisateur partagée :

    L'utilisateur actualise à nouveau l'interface et peut avoir besoin d'accéder aux données pour se reconnecter, ou accéder au cache de la page Cookie , mais vous pouvez utiliser Redis pour gérer de manière centralisée la Session de l'utilisateur. Dans ce mode, il vous suffit d'assurer la haute disponibilité de Redis. chronométrer la Session de l'utilisateur. Les mises à jour et les acquisitions peuvent être effectuées rapidement. Améliore considérablement l'efficacité.

Hash :

Il s'agit d'une structure similaire à Map Cela signifie généralement que la structure peut. be Les données, comme un objet (à condition que cet objet n'imbrique pas d'autres objets ), sont mises en cache dans Redis, puis à chaque fois que le cache est lu ou écrit, vous pouvez exploiter champ dans 🎜>Hash.

Mais cette scène est en fait un peu plus simple, car de nombreux objets sont désormais relativement complexes. Par exemple, votre objet produit peut contenir de nombreux attributs, y compris des objets. Je ne l'utilise pas beaucoup dans mes propres cas d'utilisation.

Liste :

Liste est une liste ordonnée, et vous pouvez toujours faire beaucoup de tours avec.

Par exemple, vous pouvez utiliser

List pour stocker certaines structures de données de type liste, telles que les listes de fans et les listes de commentaires d'articles.

Par exemple, vous pouvez utiliser la commande

lrange pour lire les éléments dans une plage fermée, et vous pouvez implémenter une requête de pagination basée sur List. La fonction, basée sur Redis, implémente une pagination simple et haute performance. Elle peut faire des choses comme le menu déroulant et la pagination continue de Weibo. Elle a de hautes performances et peut aller page par page.

Par exemple, vous pouvez créer une simple file d'attente de messages, la mettre depuis l'en-tête de la

Liste et la retirer du fond de la Liste. La

Liste elle-même est une structure de données couramment utilisée dans notre processus de développement, sans parler des données chaudes.

  • File d'attente de messages : la structure de liste chaînée de Redis peut facilement implémenter une file d'attente de blocage, et vous pouvez utiliser des commandes d'entrée et de sortie à droite pour compléter la file d'attente conception. Par exemple : un producteur de données peut utiliser la commande Lpush pour insérer des données depuis la gauche, et plusieurs consommateurs de données peuvent utiliser la commande BRpop pour bloquer les données à la fin de la liste.

  • Application d'affichage de liste d'articles ou de pagination de données.

    Par exemple, la liste d'articles de notre site de blog couramment utilisé, lorsque le nombre d'utilisateurs augmente et que chaque utilisateur a sa propre liste d'articles, et lorsqu'il y a beaucoup d'articles, ils doivent être affichés dans les pages. À ce stade, vous pouvez envisager d'utiliser la liste de

    Redis, la liste est non seulement ordonnée, mais prend également en charge l'obtention d'éléments dans la plage, ce qui peut parfaitement résoudre la fonction de requête de pagination. Améliore considérablement l’efficacité des requêtes.

Ensemble :

Ensemble est un ensemble non ordonné qui supprimera automatiquement les types de doublons.

Jetez directement les données qui doivent être dédupliquées dans le système basé sur

Set, et elles seront automatiquement dédupliquées. Si vous avez besoin d'une déduplication globale rapide de certaines données, vous pouvez bien sûr le faire. la déduplication est également effectuée sur la base du HashSet dans la mémoire de la JVM, mais que se passe-t-il si l'un de vos systèmes est déployé sur plusieurs machines ? La déduplication globale Set doit être effectuée en fonction de Redis.

peut être utilisé pour effectuer des opérations d'intersection, d'union et de différence basées sur

Set Par exemple, si nous nous croisons, nous pouvons combiner les listes d'amis de deux personnes pour voir leurs amis communs. Qui est-ce? Droite.

Quoi qu'il en soit, il existe beaucoup de ces scénarios, car la comparaison est rapide et l'opération est simple. Deux requêtes peuvent être effectuées avec un seul

Set.

Ensemble trié :

Ensemble trié est trié Ensemble, déduplication mais Tri OK, donner un score lors de l'écriture et trier automatiquement en fonction du score.

Les scénarios d'utilisation des ensembles ordonnés sont similaires aux ensembles, mais les ensembles d'ensembles ne sont pas automatiquement ordonnés, tandis que l'

Ensemble trié peut utiliser des scores pour trier les membres, et il est trié lors de l'insertion. Ainsi, lorsque vous avez besoin d'une set list ordonnée et non dupliquée, vous pouvez choisir la structure de données Ensemble trié en option.

  • Classement : scénarios d'utilisation classiques des collections commandées. Par exemple, un site de vidéos doit classer les vidéos mises en ligne par les utilisateurs. Le classement peut être maintenu sous de nombreux aspects : selon le temps, selon le nombre de vues, selon le nombre de likes obtenus, etc.

  • Utilisez des

    Ensembles triés pour créer une file d'attente pondérée. Par exemple, le score des messages ordinaires est de 1 et le score des messages importants est de 2. Ensuite, le travailleur. le fil peut choisir d'appuyer sur la partition pour obtenir les tâches de travail dans l'ordre inverse. Priorisez les tâches importantes.

    La liste de recherche chaude Weibo a une valeur de popularité à l'arrière et le nom devant

Utilisation avancée :

Bitmap :

Bitmap prend en charge le stockage des informations en bits et peut être utilisé pour implémenter

BloomFilter );

HyperLogLog :

fournit des fonctions de déduplication et de comptage imprécises, ce qui est plus adapté à la suppression de données à grande échelle, telles que les UV statistiques ;

Géospatial :

Peut être utilisé pour enregistrer la position géographique et calculer la distance de localisation ou calculer la position en fonction du rayon, etc. Avez-vous déjà pensé à utiliser Redis pour implémenter des personnes à proximité ? Ou calculer le chemin optimal sur la carte ?

Ces trois peuvent en fait être considérés comme une sorte de structure de données. Je ne sais pas combien d'amis se souviennent encore que je l'ai mentionné dans les bases de Redis où le rêve a commencé. , alors vous ne pouvez obtenir que 60 points. Si vous pouvez déterminer une utilisation avancée, alors je pense que vous avez quelque chose.

pub/sub : La fonction

est une fonction de publication par abonnement qui peut être utilisée comme une simple file d'attente de messages.

Pipeline :

peut exécuter un ensemble d'instructions par lots et renvoyer tous les résultats en même temps, ce qui peut réduire les réponses fréquentes aux demandes.

Lua :

Redis prend en charge la soumission de scripts Lua pour exécuter une série de fonctions.

Quand j'étais chez mon ancien patron du e-commerce, j'utilisais souvent ce truc dans des scénarios de vente flash. Il a du sens et exploite son atomicité.

Au fait, vous voulez voir le design de la vente flash ? Je me souviens que j'avais l'impression de poser cette question à chaque fois que j'étais interviewé. Si vous voulez le voir, aimez-le et commentez pour une remise instantanée.

Transaction :

La dernière fonction est transaction, mais Redis ne fournit pas de transaction stricte, Redis garantit uniquement l'exécution en série des commandes et peut garantir toutes les exécutions. Cependant, lorsque l'exécution de la commande échoue, elle ne reculera pas, mais continuera à s'exécuter.

Persistence

Redis fournit deux méthodes de persistance : RDB et AOF stockent les données en mémoire. est écrit sur le disque sous la forme d'un instantané. L'opération réelle est exécutée via le sous-processus fork et utilise le stockage par compression binaire ; journal de texte.

RDB

Enregistre l'intégralité des données Redis dans un seul fichier, ce qui est plus adapté à la reprise après sinistre. Cependant, l'inconvénient est que si la machine tombe en panne avant que l'instantané ne soit enregistré, les données. pendant cette période sera perdu, et l'enregistrement de l'instantané peut entraîner l'indisponibilité du service pendant une courte période.

AOF

Le mode d'ajout est utilisé pour écrire des opérations dans les fichiers journaux. Il a une stratégie de synchronisation flexible et prend en charge la synchronisation par seconde, la synchronisation par modification et la non-synchronisation. même taille d'ensemble de données, AOF est plus grand que RDB et AOF est souvent plus lent que RDB en termes d'efficacité opérationnelle. Pour plus de détails, veuillez vous rendre au chapitre sur la haute disponibilité, notamment les avantages et les inconvénients des deux, et comment choisir.

Série "Slap the Interviewer" - Sentinelle Redis, persistance, maître-esclave, LRU déchiqueté à la main

Haute disponibilité Regardons la haute disponibilité de Redis. Redis prend en charge la synchronisation maître-esclave, fournit le mode de déploiement de cluster Cluster et surveille l'état du serveur maître Redis via Sentinel. Lorsque le maître tombe en panne, un nouveau maître est sélectionné parmi le nœud esclave selon une certaine stratégie, et d'autres esclaves sont adaptés au nouveau maître.

Il existe trois stratégies simples de sélection du maître :

Plus la priorité de l'esclave est faible, plus la priorité est élevée
  • Dans les mêmes circonstances, le répliques esclaves Plus il y a de données, plus la priorité est élevée
  • Dans les mêmes conditions, plus le runid est petit, plus il est facile à sélectionner ;
  • Dans le cluster Redis, sentinel sera également déployé dans plusieurs instances, et les sentinelles utilisent le protocole Raft pour assurer leur haute disponibilité.

Redis Cluster utilise un mécanisme de partitionnement et est divisé en interne en 16 384 emplacements, qui sont répartis sur tous les nœuds maîtres. Chaque nœud maître est responsable d'une partie des emplacements. Pendant le fonctionnement des données, CRC16 est effectué en fonction de la clé pour calculer dans quel emplacement il se trouve et quel maître le traitera. La redondance des données est assurée via les nœuds esclaves.

SentinelSentinel doit utiliser trois instances pour assurer sa robustesse Sentinel + maître-esclave et

ne peut garantir les données. Il n'y en a pas. perte

, mais la haute disponibilité du cluster peut être garantie. Pourquoi avons-nous besoin de trois instances ? Voyons d'abord ce qui se passe avec les deux sentinelles.

Maître est à terre Tant qu'une des deux sentinelles s1 et s2 pense que vous êtes à terre, elle basculera et une sentinelle sera élue. . Échec d'exécution, mais cette fois nécessite également que la plupart des sentinelles soient en cours d'exécution.

Alors quel est le problème avec ça ? Si M1 est en panne, ce n'est pas grave si S1 n'est pas en panne, mais que se passe-t-il si la machine entière est en panne ? La seule sentinelle restante est S2, et il n'y a aucune sentinelle pour permettre le basculement. Bien qu'il y ait R1 sur l'autre machine, le basculement n'est pas exécuté.

Le cluster sentinelle classique est comme ceci :

La machine où se trouve M1 est en panne, et il y a deux sentinelles, deux personnes Il semble qu'il ne soit pas en panne, alors nous pouvons en élire une pour effectuer le basculement.

Nuan Nan, permettez-moi de résumer brièvement les principales fonctions du composant sentinelle :

  • Surveillance du cluster : responsable de surveiller si les processus maître et esclave Redis fonctionnent correctement.
  • Notification de message : si une instance Redis échoue, Sentinel est responsable de l'envoi de messages sous forme de notifications d'alarme à l'administrateur.
  • Failover : Si le nœud maître se bloque, il sera automatiquement transféré vers le nœud esclave.
  • Centre de configuration : en cas de basculement, informez le client de la nouvelle adresse principale.

Maître-esclave

En mentionnant cela, c'est comme la persistance des données que j'ai mentionnée plus tôt RDB A une relation étroite avec AOF.

Permettez-moi d'abord de parler des raisons pour lesquelles nous devons utiliser le modèle d'architecture maître-esclave. Comme mentionné précédemment, il existe une limite supérieure pour le QPS sur une seule machine et les caractéristiques de Redis doit être pris en charge Si vous lisez avec une simultanéité élevée, vous pouvez lire et écrire sur une seule machine Qui peut supporter cela Vous n'êtes pas un être humain ! Mais si vous laissez cette machine maître écrire, synchroniser les données avec d'autres machines esclaves et qu'elles l'utilisent toutes pour lire, ne serait-il pas préférable de distribuer un grand nombre de requêtes, et lors de l'extension de la capacité, l'expansion horizontale peut être facilement réalisable.

Lorsque vous démarrez un esclave, il enverra une commande

psync au maître si cet esclave est le premier. connecté au maître, il déclenchera une réplication complète. Le maître démarrera un thread, générera un instantané RDB et mettra en cache les nouvelles demandes d'écriture en mémoire. Une fois le fichier RDB généré, le maître générera ce RDB. Envoyé à l'esclave. La première chose que l'esclave fait après l'avoir obtenu est de l'écrire sur le disque local, puis de le charger dans la mémoire. Ensuite, le maître enverra tous les nouveaux noms mis en cache dans la mémoire à l'esclave.

Après l'avoir posté, un internaute du CSDN : Jian_Shen_Zer a posé une question :

Lorsque le maître-esclave est synchronisé, lorsqu'un nouvel esclave arrive, utilisez

RDB , qu'en est-il des données après ça ? Comment synchroniser les nouvelles données du maître vers l'esclave ?

Ao Bing a répondu : Stupide,

AOF, l'incrémental est comme le Binlog de MySQL. Idem, synchronisez simplement l'incrément de journal avec le service esclave

mécanisme de défaillance de clé

Redis L'expiration le temps peut être défini pour la clé.Après l'expiration, Redis utilise une combinaison de mécanismes de défaillance actifs et passifs. L'un consiste à déclencher la suppression passive pendant l'accès comme MC, et l'autre est la suppression active régulière.

Périodique + paresseux + élimination de la mémoire

FAQ sur la mise en cache

Méthode de mise à jour du cache

C'est quelque chose que vous devriez considérer lorsque vous décidez d'utiliser la mise en cache.

Les données mises en cache doivent être mises à jour lorsque la source de données change. La source de données peut être une base de données ou un service distant. La méthode de mise à jour peut être une mise à jour active. Lorsque la source de données est une base de données, le cache peut être mis à jour directement après la mise à jour de la base de données.

Lorsque la source de données n'est pas une base de données mais d'autres services distants, elle peut ne pas être en mesure de détecter de manière proactive les modifications des données en temps opportun. Dans ce cas, vous choisissez généralement de définir une date d'expiration pour les données mises en cache, ce qui est le cas. est le temps de tolérance maximum pour l'incohérence des données.

Dans ce scénario, vous pouvez choisir la mise à jour d'invalidation. Lorsque la clé n'existe pas ou est invalide, demandez d'abord à la source de données d'obtenir les dernières données, puis mettez-la à nouveau en cache et mettez à jour la date d'expiration.

Mais il y a un problème avec cela. Si le service distant dépendant rencontre une exception lors de la mise à jour, les données seront indisponibles. La méthode améliorée est la mise à jour asynchrone, ce qui signifie que les données ne sont pas effacées à leur expiration, mais que les anciennes données continuent d'être utilisées, puis le thread asynchrone effectue la tâche de mise à jour. Cela évite la période fenêtre au moment de la défaillance. Il existe également une méthode de mise à jour purement asynchrone qui met à jour les données par lots à intervalles réguliers. En utilisation réelle, vous pouvez choisir la méthode de mise à jour en fonction du scénario commercial.

Incohérence des données

Le deuxième problème est le problème de l'incohérence des données. On peut dire que tant que vous utilisez le cache, vous devez le faire. réfléchissez à la manière de faire face à ce problème. La raison de l'incohérence du cache est généralement l'échec de la mise à jour active. Par exemple, après la mise à jour de la base de données, la demande de mise à jour de

Redis expire pour des raisons de réseau ou l'échec de la mise à jour asynchrone ;

La solution est que si le service n'est pas particulièrement sensible au temps, des tentatives peuvent être ajoutées ; si le service est sensible au temps, les mises à jour échouées peuvent être gérées via des tâches de compensation asynchrones, ou des tâches de compensation asynchrones. les incohérences des données à terme n'affecteront pas l'entreprise, tant que la prochaine mise à jour pourra réussir et que la cohérence finale pourra être garantie.

Pénétration du cache

Pénétration du cache. La cause de ce problème peut être une attaque malveillante externe. Par exemple, les informations utilisateur sont mises en cache, mais l'attaquant malveillant demande fréquemment l'interface en utilisant un ID utilisateur inexistant, ce qui entraîne l'échec du cache de requêtes, puis de la requête via la base de données. manque encore. À ce moment-là, un grand nombre de requêtes pénétreront dans le cache pour accéder à la base de données.

La solution est la suivante.

  • Pour les utilisateurs non existants, enregistrez un objet vide dans le cache pour le marquer afin d'empêcher le même ID d'accéder à nouveau à la base de données. Cependant, parfois, cette méthode ne résout pas bien le problème et peut entraîner le stockage d'une grande quantité de données inutiles dans le cache.

  • Utilisez le filtre BloomFilter La fonctionnalité de BloomFilter est la détection d'existence. Si elle n'existe pas dans BloomFilter, alors les données ne doivent pas exister si elles existent dans BloomFilter. BloomFilter, les données réelles peuvent ne pas exister. Très approprié pour résoudre ce genre de problèmes.

Panne du cache

Panne du cache se produit lorsqu'un certain point d'accès échoue, un grand nombre de requêtes pour ces données pénétreront dans la source de données.

Il existe les moyens suivants pour résoudre ce problème.

  • Vous pouvez utiliser une mise à jour mutex pour garantir qu'il n'y aura pas de demandes simultanées à la base de données pour les mêmes données dans le même processus, réduisant ainsi la pression de la base de données.

  • Utilisez la méthode d'attente aléatoire, mettez en veille de manière aléatoire pendant une courte période en cas d'échec, interrogez à nouveau et effectuez une mise à jour en cas d'échec.

  • Pour résoudre le problème de l'échec simultané de plusieurs clés de point d'accès, vous pouvez utiliser une heure fixe plus un petit nombre aléatoire lors de la mise en cache pour éviter qu'un grand nombre de clés de point d'accès échouent au même moment. en même temps.

Avalanche de cache

Avalanche de cache La raison est que le cache se bloque. Toutes les demandes seront envoyées à la DB.

Solution :

  • Utiliser la stratégie de disjoncteur à défaillance rapide pour réduire la pression instantanée sur la base de données

  • Utiliser ; le mode maître-esclave et le mode Cluster sont utilisés pour assurer la haute disponibilité des services de cache.

Dans des scénarios réels, ces deux méthodes seront utilisées en combinaison.

Les vieux amis savent tous pourquoi je ne l'ai pas présenté en grand Juste quelques points Mon article précédent était vraiment trop détaillé, donc je n'ai pas pu m'empêcher . cliquez dessus. Aimez de cette façon, je ne le dupliquerai pas ici.

  • Série « Frapper l'intervieweur » - Bases de Redis
  • Série « Frapper l'intervieweur » - Avalanche de cache, panne, pénétration
  • Série « Frapper l'intervieweur » - Redis Sentinel, Persistance, Maître-Esclave, LRU déchiqueté à la main
  • Série « Frapper l'intervieweur » - Chapitre final de Redis - L'hiver arrive, FPX - Le nouveau roi monte sur le trône

Points de test et points bonus

Prendre des notes !

Point de test

Je vous poserai des questions sur le cache lors de l'entretien , principalement pour l'inspection Compréhension des fonctionnalités de mise en cache, maîtrise des caractéristiques et de l'utilisation de MC et Redis.

  • Vous devez connaître les scénarios d'utilisation du cache et comment utiliser différents types de cache, par exemple :
  • -Cache DB hotspot data pour réduire la pression de la base de données ; Services dépendants du cache pour améliorer les performances de concurrence ;

  • - Les scénarios de mise en cache K-V simples peuvent utiliser MC, mais des formats de données spéciaux tels que la liste et l'ensemble sont nécessaires pour être mis en cache, vous pouvez utiliser Redis

  • - Si vous avez besoin de mettre en cache une liste de vidéos récemment lues par un utilisateur, vous pouvez utiliser la liste de Redis pour l'enregistrer et calculer le classement. Lors de la collecte des données de liste, vous pouvez utiliser la structure zset de Redis pour l'enregistrer.

  • Pour comprendre les commandes communes de MC et de

    Redis, telles que l'augmentation et la diminution atomiques, les commandes pour opérer sur différentes structures de données, etc. .

  • Comprendre la structure de stockage de MC et de

    Redis en mémoire, ce qui sera utile pour évaluer la capacité d'utilisation.

  • Comprendre les méthodes de défaillance des données et les stratégies de suppression de MC et

    Redis, telles que la suppression périodique déclenchée activement et la suppression différée déclenchée passivement

  • Comprendre la persistance, la synchronisation maître-esclave de

    Redis et les principes de déploiement du Cluster, comme la mise en œuvre du RDB et du AOF et différence.

  • Vous devez connaître les similitudes, les différences et les solutions en cas de pénétration, de panne et d'avalanche de cache.

  • Que vous ayez ou non une expérience en e-commerce, je pense que vous devez connaître la mise en œuvre spécifique des ventes flash et les détails.

  • ……..

Points bonus

Si Si Si vous souhaitez obtenir de meilleurs résultats lors des entretiens, vous devez également connaître les points bonus suivants.

  • consiste à introduire l'utilisation du cache en fonction de scénarios d'application réels. Par exemple, lorsque vous appelez l'interface du service back-end pour obtenir des informations, vous pouvez utiliser le cache multi-niveaux local + distant pour les scénarios de classement dynamique, vous pouvez envisager d'utiliser l'

    Ensemble triéRedis. 🎜> pour y parvenir, etc.

  • Il est préférable que vous ayez de l'expérience dans la conception et l'utilisation de cache distribué, par exemple dans quels scénarios avez-vous utilisé Redis dans le projet, quelles structures de données sont utilisées et quelles les types de problèmes sont résolus ; Lors de l'utilisation de MC, ajuster les paramètres d'allocation de McSlab en fonction de la taille estimée, etc.

  • Il est préférable de comprendre les problèmes qui peuvent survenir lors de l'utilisation du cache. Par exemple, Redis est une requête de traitement à thread unique. Les tâches fastidieuses à requête unique doivent être évitées autant que possible pour éviter toute influence mutuelle ; au même endroit que d'autres processus gourmands en CPU ; ou désactivez l'échange de mémoire d'échange pour empêcher les données du cache de Redis d'être échangées sur le disque dur et d'affecter les performances. Un autre exemple est le problème de calcification MC mentionné précédemment.

  • Pour comprendre les scénarios d'application typiques de
  • Redis

    , par exemple, utilisez Redis pour implémenter des verrous distribués, utilisez Bitmap Pour implémenter BloomFilter, utilisez HyperLogLog pour effectuer des statistiques UV et ainsi de suite.

    Connaître les nouvelles fonctionnalités de Redis 4.0 et 5.0, telles que la file d'attente de messages persistante Stream qui prend en charge l'extension de fonctions personnalisées via le système de modules, etc.
  • ……..
  • Pour plus de connaissances liées à la programmation, veuillez visiter :
  • Vidéo de programmation
 ! !

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer