Maison >développement back-end >tutoriel php >Dix conseils pour utiliser correctement Redis
Redis est très populaire dans la communauté technologique actuelle. Depuis un petit projet personnel d'Antirez jusqu'à devenir la norme industrielle en matière de stockage de données en mémoire, Redis a parcouru un long chemin. La plupart des gens peuvent utiliser Redis correctement. Ci-dessous, nous explorerons 10 conseils pour utiliser Redis correctement.
1. Arrêtez d'utiliser KEYS *
D'accord, commencer cet article en contestant cette commande n'est peut-être pas un bon moyen, mais c'est peut-être un peu le plus important. peu. Souvent, lorsque nous prêtons attention aux statistiques d'une instance Redis, nous entrerons rapidement la commande "KEYS *" afin que les informations clés soient clairement affichées. Pour être honnête, du point de vue de la programmation, nous avons tendance à écrire du pseudocode comme celui-ci :
for key in 'keys *': doAllTheThings()
Mais lorsque vous disposez de 13 millions de clés, la vitesse d'exécution sera être plus lent. Étant donné que la complexité temporelle de la commande KEYS est O(n), où n est le nombre de clés à renvoyer, la complexité de cette commande dépend de la taille de la base de données. Et lors de l’exécution de cette opération, aucune autre commande ne pourra être exécutée dans votre instance.
Comme commande alternative, jetez un œil à SCAN, qui vous permet d'effectuer de manière plus conviviale... SCAN analyse la base de données dans une itération incrémentielle. Cette opération est effectuée en fonction de l'itérateur du curseur, vous pouvez donc arrêter ou continuer à tout moment comme bon vous semble.
2. Découvrez le coupable qui ralentit Redis
Comme Redis ne dispose pas de journaux très détaillés, il est très difficile de savoir ce qui se fait dans l'instance Redis. . Difficile. Heureusement, Redis fournit un outil de statistiques de commandes comme le suivant :
127.0.0.1:6379> INFO commandstats # Commandstats cmdstat_get:calls=78,usec=608,usec_per_call=7.79 cmdstat_setex:calls=5,usec=71,usec_per_call=14.20 cmdstat_keys:calls=2,usec=42,usec_per_call=21.00 cmdstat_info:calls=10,usec=1931,usec_per_call=193.10
À l'aide de cet outil, vous pouvez afficher des instantanés de toutes les statistiques de commandes, telles que le nombre de fois où la commande a été exécutée. a été exécuté. Le nombre de millisecondes nécessaires pour exécuter une commande (temps total et moyen pour chaque commande)
Exécutez simplement la commande CONFIG RESETSTAT pour la réinitialiser, afin d'obtenir un tout nouveau résultat statistique.
3. Utilisez les résultats de Redis-Benchmark comme référence au lieu de généraliser.
Salvatore, le père de Redis, a déclaré : "Tester Redis en exécutant des commandes GET/SET C'est comme tester à quel point les essuie-glaces d'une Ferrari nettoient les rétroviseurs un jour de pluie. » Souvent, les gens viennent me voir et veulent savoir pourquoi leurs statistiques Redis-Benchmark sont inférieures aux résultats optimaux. Mais il faut prendre en compte diverses situations réelles, telles que :
Par quels environnements d'exécution client peut-il être restreint ? Est-ce que
a le même numéro de version ?
Les performances dans l'environnement de test sont-elles cohérentes avec l'environnement dans lequel l'application sera exécutée ?
Les résultats des tests de Redis-Benchmark fournissent un point de référence pour garantir que votre Redis-Server ne fonctionnera pas dans un état anormal, mais vous ne devez jamais le prendre comme un véritable " Test de stress ». Les tests de résistance doivent refléter le fonctionnement de l'application et nécessitent un environnement aussi similaire que possible à la production.
4. Les hachages sont votre meilleur choix
Introduisez les hachages de manière élégante. Les hachages vous apporteront une expérience inédite. J'ai déjà vu de nombreuses structures clés similaires à celles-ci :
foo:first_name foo:last_name foo:address
Dans l'exemple ci-dessus, foo peut être le nom d'utilisateur d'un utilisateur, où chaque élément est un clé séparée. Cela augmente la marge d’erreur et les clés inutiles. Utilisez plutôt du hachage, vous serez surpris de constater que vous n'avez besoin que d'une seule clé :
127.0.0.1:6379> HSET foo first_name "Joe" (integer) 1 127.0.0.1:6379> HSET foo last_name "Engel" (integer) 1 127.0.0.1:6379> HSET foo address "1 Fanatical Pl" (integer) 1 127.0.0.1:6379> HGETALL foo 1) "first_name" 2) "Joe" 3) "last_name" 4) "Engel" 5) "address" 6) "1 Fanatical Pl" 127.0.0.1:6379> HGET foo first_name "Joe"
5. >
Profitez des délais d'attente des touches autant que possible. Un bon exemple consiste à stocker quelque chose comme une clé d'authentification temporaire. Lorsque vous recherchez une clé d'autorisation - prenez OAUTH comme exemple - vous obtenez généralement un délai d'attente. De cette façon, lors de la définition de la clé, réglez-la sur le même délai d'expiration et Redis l'effacera automatiquement pour vous ! Il n'est plus nécessaire d'utiliser KEYS * pour parcourir toutes les touches. Quelle commodité ?6. Choisissez la stratégie de recyclage appropriée
Maintenant que nous avons parlé de l'effacement des clés, parlons de la stratégie de recyclage. Lorsque l'espace de l'instance Redis est rempli, il tentera de récupérer certaines clés. En fonction de votre utilisation, je recommande fortement d'utiliser la stratégie Volatile-lru - à condition d'avoir défini un timeout sur la clé. Mais si vous exécutez quelque chose de similaire à un cache et que vous ne définissez pas de mécanisme de délai d'attente pour les clés, vous pouvez envisager d'utiliser le mécanisme de recyclage allkeys-lru. Ma suggestion est de vérifier d'abord ce qui est possible ici.7. Si vos données sont très importantes, veuillez utiliser Try/Except
Si vous devez vous assurer que les données critiques peuvent être mises dans l'instance Redis, c'est le cas. Il est fortement recommandé de mettre cela dans un bloc try/sauf. Presque tous les clients Redis adoptent la stratégie « envoyer et oublier », il est donc souvent nécessaire de se demander si une clé est réellement placée dans la base de données Redis. La complexité de l'insertion de try/expect dans les commandes Redis n'est pas le sujet de cet article. Vous devez simplement savoir que cela garantit que les données importantes sont placées là où elles devraient être.8. N'épuisez pas une instance
Dans la mesure du possible, répartissez la charge de travail de plusieurs instances Redis. À partir de la version 3.0.0, Redis prend en charge les clusters. Redis Cluster vous permet de séparer certaines clés contenant des modes maître/esclave en fonction de plages de clés. La « magie » complète derrière le clustering peut être trouvée ici. Mais si vous cherchez des tutoriels, c'est l'endroit idéal. Si le clustering n'est pas une option, envisagez les espaces de noms et répartissez vos clés sur plusieurs instances. Concernant la façon de distribuer les données, il y a cette excellente revue sur le site redis.io.
9. Plus de cœurs sont-ils meilleurs ?
Bien sûr, c'est faux. Redis est un processus monothread et ne consomme qu'un maximum de deux cœurs, même avec la persistance activée. À moins que vous n'envisagiez d'exécuter plusieurs instances sur un seul hôte - espérons-le uniquement dans un environnement de développement et de test ! ——Sinon, il n'est pas nécessaire de disposer de plus de 2 cœurs pour une instance Redis.
10. Haute disponibilité
Jusqu'à présent, Redis Sentinel a été minutieusement testé et de nombreux utilisateurs l'ont appliqué à des environnements de production (y compris ObjectRocket). Si votre application s'appuie fortement sur Redis, vous devez proposer une solution haute disponibilité pour vous assurer qu'elle ne se déconnecte pas. Bien sûr, si vous ne souhaitez pas gérer ces choses vous-même, ObjectRocket fournit une plate-forme haute disponibilité et un support technique 7 x 24 heures. Si vous êtes intéressé, vous pouvez l'envisager.
Recommandations associées :
Méthode correcte pour déverrouiller le verrouillage Redis
Résumé de l'expérience d'optimisation Redis
Résumé des méthodes courantes pour faire fonctionner Redis en PHP
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!