Maison >développement back-end >tutoriel php >Accélérer les applications existantes avec un cache redis

Accélérer les applications existantes avec un cache redis

Christopher Nolan
Christopher Nolanoriginal
2025-02-17 11:03:13198parcourir

redis accélère les applications existantes: les requêtes de cache et réduit la charge du serveur

Points de base:

  • Redis accélère efficacement les applications existantes en mettant en cache les résultats de la requête, réduisant ainsi la pression du serveur. Il stocke les résultats de requête pendant une période spécifiée (par exemple, 24 heures), puis réutilise ces résultats, améliorant considérablement la vitesse d'application.
  • L'installation de redis peut être terminée via le gestionnaire de package du système d'exploitation ou manuellement. Le processus d'installation comprend d'éviter les avertissements communs et de s'assurer que Redis démarre automatiquement après le redémarrage du serveur.
  • La bibliothèque Predis fonctionne avec Redis pour fournir une couche de cache de mémoire pour les applications. Ce processus consiste à vérifier si les résultats de la requête actuelle existent dans le cache, à récupérer les résultats s'ils n'existent pas et à les stocker pour une utilisation future.
  • Pour améliorer encore les performances, Predis recommande d'installer PHPiredis, une extension PHP qui réduit les frais généraux de la sérialisation du protocole Redis et l'analyse, ce qui rend l'installation redis plus rapidement.

Nous avons déjà introduit les bases de Redis dans PHP, mais il est maintenant temps d'introduire un cas d'application pratique. Dans ce tutoriel, nous l'ajoutons à l'application déployée pour améliorer la vitesse de l'application.

Speeding up Existing Apps with a Redis Cache

Vous pouvez cloner la version 0.6 de l'application pour apprendre facilement.

Description du problème:

Avant d'appliquer la solution, nous devons clarifier la définition du problème.

L'application en question accède à l'API de Diffbot et interroge l'ensemble de données lors de l'exécution d'une requête. Puis retournez et affichez le sous-ensemble. Cela peut prendre environ 5 secondes, selon l'occupation du serveur Diffbot. Bien que cela s'améliorera sans aucun doute lorsqu'ils élargissent leur pouvoir de calcul, il serait formidable que les résultats de la requête qui ont été exécutés une fois étaient rappelés et réutilisés pendant 24 heures, car l'ensemble lui-même est seulement mis à jour si fréquemment.

Vous pourriez penser: "Quels sont les avantages de la mise en cache d'une seule requête?"

En fait, la recherche montre que les gens recherchent souvent le même contenu (react populaire? "React" Les requêtes augmentent soudainement), et ils rechercheront également des auteurs bien connus (ou eux-mêmes). Étant donné que la mise en œuvre de ce cache ne coûte presque rien (en fait, en réduisant le coût en réduisant la pression du serveur), l'ajout est une simple victoire, même si elle n'est pas utilisée aussi souvent que vous le souhaitez. Aucune raison de ne pas l'ajouter —it ne peut être qu'en notre faveur.

Lorsque nous définissons clairement le problème, traitons les conditions préalables.

Installation:

Tout d'abord, nous devons installer Redis dans l'environnement de développement et de production (notez que si vous utilisez Homestead dans le développement local, Redis est déjà installé, mais au moment de la rédaction, version 3.0.1).

Nous pouvons le faire via le gestionnaire de packages du système d'exploitation:

<code class="language-bash">sudo apt-get install redis-server</code>

Il s'agit de la méthode la plus simple et recommandée, mais nous pouvons également l'installer à partir de zéro et la configurer manuellement. Selon les instructions de leur site Web, cela peut être fait par:

<code class="language-bash">sudo apt-get install gcc make build-essential tcl
wget http://download.redis.io/releases/redis-3.0.2.tar.gz
tar xzf redis-3.0.2.tar.gz
cd redis-3.0.2
make
make test
sudo make install</code>

Si vous rencontrez une erreur fatale en mentionnant Jemalloc.h après avoir exécuté la marque, il suffit de faire de la distrclean et de faire fonctionner à nouveau. La commande MakE Test est facultative, mais elle est utile.

Remarque: Si vous lisez cet article et que la version 3.0.2 n'est plus la dernière, ajustez simplement la commande au dernier numéro de version.

Pour éviter certains avertissements communs (au moins sur Ubuntu), nous exécutons également de manière préventive la commande suivante:

<code class="language-bash">sudo sh -c 'echo "vm.overcommit_memory=1" >> /etc/sysctl.conf'
sudo sh -c 'echo "net.core.somaxconn=65535" >> /etc/sysctl.conf'
sudo sh -c 'echo "never" > /sys/kernel/mm/transparent_hugepage/enabled'</code>

Nous nous assurons également d'ajouter la dernière commande à /etc/rc.local, juste au-dessus de la sortie 0, afin qu'il puisse être réexécuté à chaque fois que le serveur redémarre. Enfin, nous pouvons redémarrer le serveur à l'aide du redémarrage sudo et vérifier si Redis s'exécute correctement en exécutant Sudo Redis-Server.

Enfin, nous devons nous assurer que Redis démarre automatiquement après le redémarrage du serveur, nous le ferons donc conformément aux instructions officielles.

Predis:

Nous avons couvert les bases de Predis auparavant, et dans ce cas, nous l'utiliserons également. Installons-le en utilisant la commande suivante:

<code class="language-bash">composer require predis/predis</code>

Ensuite, supposons que nous avons maîtrisé l'introduction susmentionnée à Predis.

Étant donné que ce post a été publié, certaines différences légères ont été introduites (comme la transition vers des espaces de noms), mais l'API que nous devons utiliser est à peu près la même.

Implémentation:

Afin d'utiliser Redis dans notre application, nous devons suivre les étapes suivantes:

  • Affichez si les résultats de la requête actuels existent dans le cache
  • s'il existe, obtenez le résultat
  • s'il n'existe pas, obtenez le résultat, stockez le résultat et transmettez le résultat au reste de l'application

Par conséquent, l'implémentation est très simple: sous la vérification "Form Soumettre" (celle qui recherche le paramètre "Recherche"), nous instancrons le client Predis, calculons le hachage MD5 de la requête de recherche exécutée, puis vérifiez Si ses résultats sont vérifiés. Si faux, le processus précédent se poursuit, mais ne sera pas:

<code class="language-php">$result = ...
$info = ...</code>

se termine, mais sérialise directement le résultat et l'enregistre en cache. Ensuite, en dehors du bloc de code, nous obtenons les résultats du cache et le flux de l'application se poursuit comme d'habitude. Par conséquent, la pièce modifiée dans le fichier index.php ressemble à ceci:

<code class="language-php">// 检查是否提交了搜索表单
if (isset($queryParams['search'])) {

    $redis = new Client();
    $hash = md5($_SERVER['QUERY_STRING']);
    if (!$redis->get($hash . '-results')) {

        $diffbot = new Diffbot(DIFFBOT_TOKEN);

        // 构建搜索字符串
        $searchHelper = new SearchHelper();
        $string = (isset($queryParams['q']) && !empty($queryParams['q']))
            ? $queryParams['q']
            : $searchHelper->stringFromParams($queryParams);

        // 基础设置
        $search = $diffbot
            ->search($string)
            ->setCol('sp_search')
            ->setStart(($queryParams['page'] - 1) * $resultsPerPage)
            ->setNum($resultsPerPage);

        $redis->set($hash . '-results', serialize($search->call()));
        $redis->expire($hash . '-results', 86400);
        $redis->set($hash . '-info', serialize($search->call(true)));
        $redis->expire($hash . '-info', 86400);
    }

    $results = unserialize($redis->get($hash . '-results'));
    $info = unserialize($redis->get($hash . '-info'));
}</code>
Après le test, nous pouvons voir que cela fonctionne bien - si nous actualisons la page ou exécutons une autre requête, puis revenons à la requête précédente, la requête exécutée une fois est instantanée. Enfin, nous pouvons ajouter, soumettre et pousser le déploiement:

<code class="language-bash">git add -A
git commit -m "Added Redis cache [deploy:production]"
git push origin master</code>
c'est tout! La dernière version de notre application est désormais disponible et Redis fournit des données mises en cache.

Remarque: Si vous voulez savoir comment nous passons du mode de développement au déploiement de production avec un seul engagement, vous devriez lire cet article.

Fonction finale:

Pour améliorer davantage les performances, Predis recommande d'installer PHPiredis, une extension PHP pour " réduire les frais généraux de la sérialisation du protocole Redis et l'analyse ". Puisque nous avons un contrôle complet du serveur, pourquoi ne pas faire cela?

<code class="language-bash">sudo apt-get install redis-server</code>

Cela installe des conditions préalables et permet des extensions. Maintenant, tout ce que nous avons à faire est de configurer le client Predis pour utiliser la connexion PHPiredis. Nous devons remplacer:

<code class="language-bash">sudo apt-get install gcc make build-essential tcl
wget http://download.redis.io/releases/redis-3.0.2.tar.gz
tar xzf redis-3.0.2.tar.gz
cd redis-3.0.2
make
make test
sudo make install</code>

est:

<code class="language-bash">sudo sh -c 'echo "vm.overcommit_memory=1" >> /etc/sysctl.conf'
sudo sh -c 'echo "net.core.somaxconn=65535" >> /etc/sysctl.conf'
sudo sh -c 'echo "never" > /sys/kernel/mm/transparent_hugepage/enabled'</code>

c'est tout! Notre installation Redis est plus rapide maintenant!

Conclusion:

Dans ce tutoriel, nous utilisons les bibliothèques Redis et Predis en combinaison pour faciliter l'apparence des applications déployées. Au lieu de transférer vers et depuis sa source, nous utilisons la RAM disponible de la gouttelette DigitalOcean pour enregistrer les résultats de la requête une fois par jour, puis renvoyer ces résultats du cache. Cela signifie que les résultats ne sont pas toujours à jour, mais selon ce post, les résultats eux-mêmes ne sont pas mis à jour plus fréquemment que cela.

J'espère que ce tutoriel vous montre à quel point il est facile d'ajouter une couche de cache de mémoire à votre application, et elle sera très utile lorsque vous devrez réduire le temps de chargement et réduire les coûts du serveur.

d'autres suggestions? Compétence? Commentaire? Veuillez laisser un message ci-dessous!

(La partie FAQ est omise ici parce que le contenu de la partie FAQ est dupliquée avec le contenu principal de l'article, qui est des informations redondantes. La pseudo-originalité devrait éviter le contenu en double.)

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:
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