> php教程 > PHP开发 > Laravel이 Memcached 캐시를 사용하여 기사 추가, 삭제, 수정 및 쿼리를 최적화하는 방법

Laravel이 Memcached 캐시를 사용하여 기사 추가, 삭제, 수정 및 쿼리를 최적화하는 방법

高洛峰
풀어 주다: 2016-12-28 16:34:41
원래의
1110명이 탐색했습니다.

이 기사의 예에서는 Laravel이 Memcached 캐시를 사용하여 기사의 추가, 삭제, 수정 및 쿼리를 최적화하는 방법을 설명합니다. 참고용으로 모두와 공유하세요. 자세한 내용은 다음과 같습니다.

여기에서는 기사의 추가, 삭제, 수정 및 확인을 예시 시스템으로 사용하여 캐시 사용을 설명합니다. 이 예시는 RESTFul입니다. 기사의 추가, 삭제, 수정 및 확인을 구현하기 위해 이전에 만든 스타일 컨트롤러입니다. 튜토리얼의 변환 및 업그레이드를 위해 Eloquent ORM 및 이를 기반으로 하는 모델 이벤트를 통합하고 애플리케이션 시나리오를 생성 환경으로 직접 가져올 것입니다.

1. 준비 작업

라우팅 및 컨트롤러

라우트 정의 및 컨트롤러 생성은 RESTFul 스타일 컨트롤러 생성과 동일하게 추가, 삭제, 기사 수정 및 확인.

데이터 테이블 만들기

기사에 해당하는 데이터 테이블과 관련하여 데이터베이스 섹션에서 쿼리 빌더를 사용하여 데이터베이스에 대한 고급 쿼리를 구현한다고 이미 언급했습니다. 이전에 생성된 데이터 테이블을 사용합니다.

기사 모델 생성

기사 모델 Post의 생성은 ORM 개요, 모델 정의 및 기본 쿼리에 대한 이전 Eloquent ORM 섹션의 생성과도 일치합니다.

2. 컨트롤러 수정

이전에는 캐시를 통해 기사의 추가, 삭제, 수정 및 쿼리 작업을 구현하도록 수정했습니다. 데이터베이스를 통해:

<?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;);
      }
    }
  }
로그인 후 복사

show 메소드에서는 먼저 기사 데이터를 캐시에서 가져옵니다. 캐시에 기사 데이터가 없으면 데이터베이스에서 가져옵니다. 동시에, 데이터베이스에 대한 작업의 대부분은 읽기 작업이므로, 특히 대용량 데이터를 처리할 때 이러한 작은 개선으로 성능이 크게 향상될 수 있습니다. 또한 성능 향상을 위해 지속적으로 캐시를 방문합니다.

3. 모델 이벤트에서 캐시 사용

또한 기사가 추가, 삭제 또는 수정될 때 모델 이벤트를 사용하여 해당 이벤트를 트리거하여 수정 사항을 캐시에 저장할 수도 있습니다. 모델 이벤트 등록 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);
});
로그인 후 복사

캐시 유효 기간을 1주일로 설정합니다. 이러한 방식으로 기사가 생성되거나 업데이트되면 데이터가 캐시에 저장되고 기사가 삭제되면 데이터도 캐시에서 제거되므로 세부 정보를 볼 때 삭제된 기사를 찾아볼 수 없습니다.

이 글이 Laravel 프레임워크를 기반으로 하는 모든 분들의 PHP 프로그램 설계에 도움이 되기를 바랍니다.

Laravel이 어떻게 memcached 캐싱을 사용하여 기사 추가, 삭제, 수정 및 검색을 최적화하는지에 대한 자세한 내용을 보려면 PHP 중국어 웹사이트에 주목하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 추천
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿