Maison >php教程 >PHP开发 >Comment Laravel utilise le cache Memcached pour optimiser les ajouts, suppressions, modifications et requêtes d'articles

Comment Laravel utilise le cache Memcached pour optimiser les ajouts, suppressions, modifications et requêtes d'articles

高洛峰
高洛峰original
2016-12-28 16:34:411106parcourir

L'exemple de cet article décrit comment Laravel utilise le cache memcached pour optimiser l'ajout, la suppression, la modification et l'interrogation d'articles. Partagez-le avec tout le monde pour votre référence, les détails sont les suivants :

Ici, nous utiliserons l'ajout, la suppression, la modification et la vérification d'articles comme exemple de système pour décrire l'utilisation du cache. Cet exemple est un RESTFul. Contrôleur de style créé précédemment pour implémenter l'ajout, la suppression, la modification et la vérification des articles Pour la transformation et la mise à niveau du didacticiel, nous intégrerons Eloquent ORM et modéliserons les événements basés sur celui-ci, et extrairons le scénario d'application directement dans l'environnement de génération.

1. Travail de préparation

Routage et contrôleur

La définition de la route et la création du contrôleur restent les mêmes que la création du contrôleur de style RESTFul pour implémenter l'ajout, la suppression, modification et vérification des articles.

Créer une table de données

Concernant la table de données correspondant à l'article, nous avons déjà mentionné que nous utilisons le générateur de requêtes pour implémenter des requêtes avancées sur la base de données dans la section base de données. utilisez la table de données créée auparavant.

Créer un modèle d'article

La création du modèle d'article Post est également cohérente avec la création dans la section précédente d'Eloquent ORM sur la présentation d'ORM, la définition du modèle et la requête de base.

2. Modifier le contrôleur

Auparavant, nous avons implémenté les opérations d'ajout, de suppression, de modification et de requête d'articles via le cache. Ici, nous le modifions pour implémenter les opérations d'ajout, de suppression, de modification et de requête. via la base de données :

<?php
  namespace App\Http\Controllers;
  use Illuminate\Http\Request;
  use Cache;
  use App\Models\Post;
  use App\Http\Requests;
  use App\Http\Controllers\Controller;
  class PostController extends Controller
  {
    /**
     * 显示文章列表.
     *
     * @return Response
     */
    public function index()
    {
      //使用all获取所有数据,如果数据量大采用分页获取
      $posts = Post::all();
      if(!$posts)
        exit(&#39;还没有发布任何文章!&#39;);
      $html = &#39;<ul>&#39;;
      foreach ($posts as $post) {
        $html .= &#39;<li><a href=&#39;.route(&#39;post.show&#39;,[&#39;post&#39;=>$post]).&#39;>&#39;.$post->title.&#39;</li>&#39;;
      }
      $html .= &#39;</ul>&#39;;
      return $html;
    }
    /**
     * 创建新文章表单页面
     *
     * @return Response
     */
    public function create()
    {
      $postUrl = route(&#39;post.store&#39;);
      $csrf_field = csrf_field();
      $html = <<<CREATE
        <form action="$postUrl" method="POST">
          $csrf_field
          <input type="text" name="title"><br/><br/>
          <textarea name="content" cols="50" rows="5"></textarea><br/><br/>
          <input type="submit" value="提交"/>
        </form>
CREATE;
      return $html;
}
    /**
     * 将新创建的文章存储到存储器
     *
     * @param Request $request
     * @return Response
     */
    public function store(Request $request)
    {
      $title = $request->input(&#39;title&#39;);
      $content = $request->input(&#39;content&#39;);
      $post = new Post;
      $post->title = $title;
      $post->content = $content;
      $post->save();
      return redirect()->route(&#39;post.show&#39;,[&#39;post&#39;=>$post]);
    }
    /**
     * 显示指定文章
     *
     * @param int $id
     * @return Response
     */
    public function show($id)
    {
      $post = Cache::get(&#39;post_&#39;.$id);
      if(!$post){
        $post = Post::find($id);
        if(!$post)
          exit(&#39;指定文章不存在!&#39;);
        Cache::put(&#39;post_&#39;.$id,$post,60*24*7);
      }
      if(!Cache::get(&#39;post_views_&#39;.$id))
        Cache::forever(&#39;post_views_&#39;.$id,0);
      $views = Cache::increment(&#39;post_views_&#39;.$id);
      Cache::forever(&#39;post_views_&#39;.$id,$views);
      $editUrl = route(&#39;post.edit&#39;,[&#39;post&#39;=>$post]);
      $deleteUrl = route(&#39;post.destroy&#39;,[&#39;post&#39;=>$post]);
      $html = <<<POST
        <h3>{$post->title}</h3>
        <p>{$post->content}</p>
        <i>已有{$views}人阅读</i>
        <p>
          <a href="{$editUrl}">编辑</a>
        </p>
POST;
      return $html;
    }
    /**
     * 显示编辑指定文章的表单页面
     *
     * @param int $id
     * @return Response
     */
    public function edit($id)
    {
      $post = Post::find($id);
      if(!$post)
        exit(&#39;指定文章不存在!&#39;);
      $postUrl = route(&#39;post.update&#39;,[&#39;post&#39;=>$post]);
      $csrf_field = csrf_field();
      $html = <<<CREATE
        <form action="$postUrl" method="POST">
          $csrf_field
          <input type="hidden" name="_method" value="PUT"/>
          <input type="text" name="title" value="{$post->title}"><br/><br/>
          <textarea name="content" cols="50" rows="5">{$post->content}</textarea><br/><br/>
          <input type="submit" value="提交"/>
        </form>
CREATE;
      return $html;
    }
    /**
     * 在存储器中更新指定文章
     *
     * @param Request $request
     * @param int $id
     * @return Response
     */
    public function update(Request $request, $id)
    {
      $post = Post::find($id);
      if(!$post)
        exit(&#39;指定文章不存在!&#39;);
      $title = $request->input(&#39;title&#39;);
      $content = $request->input(&#39;content&#39;);
      $post->title = $title;
      $post->content = $content;
      $post->save();
      return redirect()->route(&#39;post.show&#39;,[&#39;post&#39;=>$post]);
    }
    /**
     * 从存储器中移除指定文章
     *
     * @param int $id
     * @return Response
     */
    public function destroy($id)
    {
      $post = Post::find($id);
      if(!$post)
        exit(&#39;指定被删除文章不存在!&#39;);
      if($post->delete()){
        redirect()->route(&#39;post.index&#39;);
      }else{
        exit(&#39;删除文章失败!&#39;);
      }
    }
  }

Il est à noter que dans la méthode show, nous récupérons d'abord les données de l'article dans le cache. Si elles n'existent pas dans le cache, nous les récupérerons dans la base de données. Dans le même temps, nous réécrirons les données dans le cache. Étant donné que la plupart des opérations sur la base de données sont des opérations de lecture, cette petite amélioration peut donc grandement améliorer les performances, en particulier lorsqu'il s'agit de données massives. De plus, nous persistons dans les visites du cache pour améliorer les performances.

3. Utiliser le cache dans les événements du modèle

Nous pouvons également utiliser les événements du modèle pour déclencher les événements correspondants lorsque des articles sont ajoutés, supprimés ou modifiés afin d'enregistrer les modifications dans le cache. enregistrement d'événement de modèle Accédez à la méthode de démarrage d'AppServiceProvider :

//保存之后更新缓存数据
Post::saved(function($post){
  $cacheKey = &#39;post_&#39;.$post->id;
  $cacheData = Cache::get($cacheKey);
  if(!$cacheData){
    Cache::add($cacheKey,$post,60*24*7);
  }else{
    Cache::put($cacheKey,$post,60*24*7);
  }
});
//删除之后清除缓存数据
Post::deleted(function($post){
  $cacheKey = &#39;post_&#39;.$post->id;
  $cacheData = Cache::get($cacheKey);
  if($cacheData){
    Cache::forget($cacheKey);
  }
  if(Cache::get(&#39;post_views_&#39;.$post->id))
    Cache::forget(&#39;post_views_&#39;.$post->id);
});

Nous fixons la période de validité du cache à une semaine. De cette manière, les données seront enregistrées dans le cache lorsque l'article est créé ou mis à jour, et les données seront également supprimées du cache lorsque l'article est supprimé, garantissant ainsi que l'article supprimé ne peut pas être parcouru lors de la visualisation des détails.

J'espère que cet article sera utile à la conception de programmes PHP basés sur le framework Laravel.

Pour plus d'informations sur la façon dont Laravel utilise la mise en cache Memcached pour optimiser les ajouts, suppressions, modifications et récupérations d'articles, veuillez faire attention au site Web PHP 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