Heim > php教程 > PHP开发 > Wie Laravel den Memcached-Cache verwendet, um das Hinzufügen, Löschen, Ändern und Abfragen von Artikeln zu optimieren

Wie Laravel den Memcached-Cache verwendet, um das Hinzufügen, Löschen, Ändern und Abfragen von Artikeln zu optimieren

高洛峰
Freigeben: 2016-12-28 16:34:41
Original
1104 Leute haben es durchsucht

Das Beispiel in diesem Artikel beschreibt, wie Laravel den Memcached-Cache verwendet, um das Hinzufügen, Löschen, Ändern und Abfragen von Artikeln zu optimieren. Teilen Sie es als Referenz mit allen. Die Details lauten wie folgt:

Hier verwenden wir das Hinzufügen, Löschen, Ändern und Überprüfen von Artikeln als Beispielsystem, um die Verwendung des Caches zu beschreiben. Dieses Beispiel ist ein RESTFul Zuvor erstellter Style-Controller zum Implementieren des Hinzufügens, Löschens, Änderns und Überprüfens von Artikeln. Für die Transformation und Aktualisierung des Tutorials werden wir Eloquent ORM und darauf basierende Modellereignisse integrieren und das Anwendungsszenario direkt in die Generierungsumgebung ziehen.

1. Vorbereitungsarbeiten

Routing und Controller

Die Definition der Route und die Erstellung des Controllers bleiben dieselben wie die Erstellung des RESTFul-Style-Controllers zum Implementieren von Hinzufügung, Löschung, Änderung und Prüfung von Artikeln.

Erstellen Sie eine Datentabelle

Bezüglich der Datentabelle, die dem Artikel entspricht, haben wir bereits erwähnt, dass wir den Abfrage-Builder verwenden, um erweiterte Abfragen für die Datenbank im Datenbankbereich zu implementieren Verwenden Sie die zuvor erstellte Datentabelle.

Artikelmodell erstellen

Die Erstellung des Artikelmodells Post stimmt auch mit der Erstellung im vorherigen Eloquent ORM-Abschnitt über ORM-Übersicht, Modelldefinition und grundlegende Abfrage überein.

2. Ändern Sie den Controller

Zuvor haben wir die Vorgänge zum Hinzufügen, Löschen, Ändern und Abfragen von Artikeln über den Cache implementiert. Hier ändern wir ihn, um die Vorgänge zum Hinzufügen, Löschen, Ändern und Abfragen zu implementieren über die Datenbank:

<?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;);
      }
    }
  }
Nach dem Login kopieren

Es ist zu beachten, dass wir bei der Show-Methode zuerst die Artikeldaten aus dem Cache abrufen. Wenn sie nicht im Cache vorhanden sind, holen wir sie aus der Datenbank. Gleichzeitig werden wir die Daten zurück in den Cache schreiben. Da es sich bei den meisten Vorgängen in der Datenbank um Lesevorgänge handelt, kann diese kleine Verbesserung die Leistung erheblich verbessern, insbesondere beim Umgang mit großen Datenmengen. Darüber hinaus besuchen wir den Cache dauerhaft, um die Leistung zu verbessern.

3. Verwenden Sie den Cache in Modellereignissen

Wir können Modellereignisse auch verwenden, um entsprechende Ereignisse auszulösen, wenn Artikel hinzugefügt, gelöscht oder geändert werden, um die Änderungen im Cache zu speichern Modellereignisregistrierung Gehen Sie zur Startmethode von 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);
});
Nach dem Login kopieren

Wir legen die Cache-Gültigkeitsdauer auf eine Woche fest. Auf diese Weise werden die Daten im Cache gespeichert, wenn der Artikel erstellt oder aktualisiert wird, und die Daten werden auch aus dem Cache entfernt, wenn der Artikel gelöscht wird, wodurch sichergestellt wird, dass der gelöschte Artikel beim Anzeigen von Details nicht durchsucht werden kann.

Ich hoffe, dass dieser Artikel für jedermann beim PHP-Programmdesign basierend auf dem Laravel-Framework hilfreich sein wird.

Weitere Informationen darüber, wie Laravel Memcached-Caching verwendet, um das Hinzufügen, Löschen, Ändern und Abrufen von Artikeln zu optimieren, finden Sie auf der chinesischen PHP-Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Empfehlungen
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage