Laravel memcached缓存对文章增删改查进行优化例子

本节我们将以文章的增删改查作为实例系统讲述缓存的使用,这个实例是对之前创建RESTFul风格控制器实现文章增删改查这篇教程的改造和升级,我们将在其基础上融合进Eloquent ORM和模型事件,将应用的场景直接拉到生成环境。

1、准备工作

路由及控制器

路由的定义和控制器的创建保持和创建RESTFul风格控制器实现文章增删改查中一样。

创建数据表

关于文章对应数据表我们在数据库部分使用查询构建器实现对数据库的高级查询已有提及,这里我们使用之前创建的数据表即可。

创建文章模型

关于文章模型Post的创建也和之前Eloquent ORM部分讲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('还没有发布任何文章!');

            $html = '<ul>';

            foreach ($posts as $post) {
                $html .= '<li><a href='.route('post.show',['post'=>$post]).'>'.$post->title.'</li>';
            }

            $html .= '</ul>';

            return $html;
        }

        /**
         * 创建新文章表单页面
         *
         * @return Response
         */
        public function create()
        {
            $postUrl = route('post.store');
            $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('title');
            $content = $request->input('content');

            $post = new Post;
            $post->title = $title;
            $post->content = $content;
            $post->save();

            return redirect()->route('post.show',['post'=>$post]);
        }

        /**
         * 显示指定文章
         *
         * @param int $id
         * @return Response
         */
        public function show($id)
        {

            $post = Cache::get('post_'.$id);
            if(!$post){
                $post = Post::find($id);
                if(!$post)
                    exit('指定文章不存在!');
                Cache::put('post_'.$id,$post,60*24*7);
            }

            if(!Cache::get('post_views_'.$id))
                Cache::forever('post_views_'.$id,0);
            $views = Cache::increment('post_views_'.$id);
            Cache::forever('post_views_'.$id,$views);

            $editUrl = route('post.edit',['post'=>$post]);
            $deleteUrl = route('post.destroy',['post'=>$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('指定文章不存在!');

            $postUrl = route('post.update',['post'=>$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('指定文章不存在!');

            $title = $request->input('title');
            $content = $request->input('content');

            $post->title = $title;
            $post->content = $content;

            $post->save();

            return redirect()->route('post.show',['post'=>$post]);
        }

        /**
         * 从存储器中移除指定文章
         *
         * @param int $id
         * @return Response
         */
        public function destroy($id)
        {
            $post = Post::find($id);
            if(!$post)
                exit('指定被删除文章不存在!');

            if($post->delete()){
                redirect()->route('post.index');
            }else{
                exit('删除文章失败!');
            }
        }
    }

需要注意的是在show方法中,我们首先从缓存中取文章数据,缓存中不存在才会去数据库取,同时将数据回写到缓存中,由于对数据库的操作大部分都是读操作,所以这一点小小的改进对性能却有很大提升,尤其是在海量数据时。此外我们还将访问量持久化到缓存中以提升性能。

3、在模型事件中使用缓存

我们还可以通过模型事件在文章进行增删改的时候触发相应事件将修改保存到缓存中,这里我们简单讲模型事件注册到AppServiceProvider的boot方法中:

//保存之后更新缓存数据
Post::saved(function($post){
    $cacheKey = 'post_'.$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 = 'post_'.$post->id;
    $cacheData = Cache::get($cacheKey);
    if($cacheData){
        Cache::forget($cacheKey);
    }
    if(Cache::get('post_views_'.$post->id))
        Cache::forget('post_views_'.$post->id);
});

我们将缓存有效期设置为一周。这样在文章创建或更新时会将数据保存到缓存,而删除文章时也会从缓存中移除数据,从而保证被删除后的文章查看详情时也不能浏览。

时间: 2024-12-20 21:09:03

Laravel memcached缓存对文章增删改查进行优化例子的相关文章

Laravel使用memcached缓存对文章增删改查进行优化的方法

本文实例讲述了Laravel使用memcached缓存对文章增删改查进行优化的方法.分享给大家供大家参考,具体如下: 这里我们将以文章的增删改查作为实例系统讲述缓存的使用,这个实例是对之前创建RESTFul风格控制器实现文章增删改查这篇教程的改造和升级,我们将在其基础上融合进Eloquent ORM和模型事件,将应用的场景直接拉到生成环境. 1.准备工作 路由及控制器 路由的定义和控制器的创建保持和创建RESTFul风格控制器实现文章增删改查中一样. 创建数据表 关于文章对应数据表我们在数据库部

laravel路由创建RESTFul风格控制器实现文章增删改查

基本控制器及控制器路由.控制器中间件都比较简单,这里不再赘述,相关文档参考HTTP 控制器文档一节. 1.创建RESTFul风格控制器 注:关于什么是RESTFul风格及其规范可参考这篇文章:理解RESTful架构. 本文我们主要讨论创建一个RESTFul风格的控制器用于对博客文章进行增删改查,创建这样的控制器很简单,在应用根目录运行如下Artisan命令即可: php artisan make:controller PostController 该命令会在app/Http/Controller

C#在winform中实现数据增删改查等功能_C#教程

winform中利用ado.net实现对单表的增删改查的详细例子,具体如下: 1.前言: 运行环境:VS2013+SQL2008+Windows10 程序界面预览: 使用的主要控件:dataGridview和menuStrip等.  2.功能具体介绍: 1.首先,我们要先实现基本的数据操作,增删改查这几个操作. (1)先定义一个数据库操作的公共类: using System; using System.Collections.Generic; using System.Linq; using S

php中操作memcached缓存进行增删改查数据的实现代码_php技巧

核心代码: <?php //创建一个memcache对象实例 $memcache = new Memcache; if(!$memcache->connect("127.0.0.1",11211)){ die('连接失败'); } if($memcache->set('key1',"xian",MEMCACHE_COMPRESSED,60)){ echo 'sucess!'; }//存值,其中xian字符串,也可以为数组,对象,但不能为资源 $va

二、SQL语句映射文件(2)增删改查、参数、缓存

 二.SQL语句映射文件(2)增删改查.参数.缓存 2013-09-06 17:05:42 标签:配置文件 动态 元素 MyBatis学习 之 一.MyBatis简介与配置MyBatis+Spring+MySql MyBatis学习 之 二.SQL语句映射文件(1)resultMap MyBatis学习 之 二.SQL语句映射文件(2)增删改查.参数.缓存 MyBatis学习 之 三.动态SQL语句 MyBatis学习 之 四.MyBatis配置文件 2.2 select 一个select 元素

Laravel操作mysql数据库(增删改查)例子

1.连接数据库 Laravel中数据库配置文件为config/database.php,打开该文件,默认内容如下: <?php return [     //默认返回结果集为PHP对象实例     'fetch' => PDO::FETCH_CLASS,     //默认数据库连接为mysql,可以在.env文件中修改DB_CONNECTION的值     'default' => env('DB_CONNECTION', 'mysql'),     'connections' =>

springboot(十五):springboot+jpa+thymeleaf增删改查示例

这篇文章介绍如何使用jpa和thymeleaf做一个增删改查的示例. 先和大家聊聊我为什么喜欢写这种脚手架的项目,在我学习一门新技术的时候,总是想快速的搭建起一个demo来试试它的效果,越简单越容易上手最好.在网上找相关资料的时候总是很麻烦,有的文章写的挺不错的但是没有源代码,有的有源代码但是文章介绍又不是很清楚,所在找资料的时候稍微有点费劲.因此在我学习Spring Boot的时候,会写一些最简单基本的示例项目,一方面方便其它朋友以最快的方式去了解,一方面如果我的项目需要用到相关技术的时候,直

java web实现增删改查后,应该学习哪些高级技术?

问题描述 java web实现增删改查后,应该学习哪些高级技术? 做了个小项目,实现了curd,想继续往缓存,并发,负载高级深入,请推荐一个详细的高级技术路线?最好有书 解决方案 javaweb深入浅出,不过这个方向研究,主要还是在公司里学的会更实用些 解决方案二: 多线程,Socket,I/O JSP.EL.JSTL,AJAX JavaScript,jQuery JSON,XML EJB(可忽略) 各种框架 ......太多了 解决方案三: 多线程,Socket,I/O JSP.EL.JSTL

PHP+MYSQL实现用户的增删改查

 本文给大家分享的是使用PHP+MYSQL实现用户的增删改查功能的全部页面代码,非常的详细,也很实用,适合php的初学者,有需要的小伙伴参考下.     文件列表..文件内容.. dbconn.php userListt.php editUser.php editDo.php detailUser.php deleteUser.php addUser.php addDo.php <dbconn.php> ? 1 2 3 4 5 6 <?php // 创建数据库连接 $con = mysq