Laravel 缓存实例教程(二) —— 基于模型+缓存对文章增删改查进行优化 | 服务篇 | Laravel 5.1 基础教程


本站和网页 https://xueyuanjun.com/post/1688.html 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

Laravel 缓存实例教程(二) —— 基于模型+缓存对文章增删改查进行优化 | 服务篇 | Laravel 5.1 基础教程
Laravel 学院
文档
Laravel 8.x 中文文档
Laravel 7.x 中文文档
Laravel 6.x 中文文档
Laravel 5.8 中文文档
Laravel 5.7 中文文档
Laravel 5.6 中文文档
Laravel 5.5 中文文档
Laravel 5.4 中文文档
Laravel 5.3 中文文档
Laravel 5.2 中文文档
Laravel 5.1 中文文档
Lumen 中文文档
全栈教程
PHP 全栈工程师指南
PHP 入门到实战
Laravel 入门到精通
Vue.js 入门到实战
玩转 PhpStorm 教程
Laravel 博客入门项目
Laravel 微信小程序项目
Laravel 前后端分离项目
Swoole 入门到实战
Eloquent 性能优化实战
Redis 高性能实战系列
Laravel 新版本特性
PHP 新特性与最佳实践
Golang
Go 入门教程
Go Web 编程
Gin 使用教程
微服务开发
内功修炼
数据结构与算法
网络协议
微服务从入门到实践
高性能 MySQL 实战
高性能 Redis 实战
Laravel 消息队列实战
Laravel 从学徒到工匠
PHP 设计模式系列
名企面试指南
资源库
Laravel 资源大全
Laravel 开源项目
Laravel 扩展包
Laravel 资源下载
更多
博客 & 新闻
问答 & 讨论
Leetcode 题解
学院君读书笔记系列
关于 Laravel 学院
Laravel 互助学习群
Golang 互助学习群
更多
Laravel 中文文档
Laravel 全栈教程
Laravel 学习路径
Go 入门教程
程序员内功修炼
博客
问答
搜索
注册
登录
Info
Content
章节导航
Laravel 5.1 基础教程
目录索引
安装篇
3篇文章
在 Windows 中安装 Laravel 5.1.X
在 Windows 上进行 Laravel Homestead 安装、配置及测试
在 Laravel Homestead 中使用 Blackfire Profiler 对应用性能进行分析
基础篇
8篇文章
HTTP路由实例教程(一)—— 基本使用及路由参数
HTTP路由实例教程(二)—— 路由命名和路由分组
HTTP路由实例教程(三)—— CSRF攻击原理及其防护
中间件实例教程 —— 中间件的创建使用及中间件参数定义
HTTP控制器实例教程 —— 创建RESTFul风格控制器实现文章增删改查
HTTP 请求实例教程 —— 获取请求数据、Cookie及文件上传处理
HTTP响应实例教程 —— 基本使用、生成Cookie、返回视图、JSON/JSONP、文件下载及重定向
Laravel 视图实例教程 —— 在视图间共享数据及视图Composer
底层篇
4篇文章
Laravel 5.x 启动过程分析
Laravel 服务容器实例教程 —— 深入理解控制反转和依赖注入
Laravel 服务提供者实例教程 —— 创建 Service Provider 测试实例
Laravel 门面实例教程 —— 创建自定义 Facades 类
数据库篇
12篇文章
Laravel 数据库实例教程 —— 使用DB门面操作数据库
Laravel 数据库实例教程 —— 使用查询构建器对数据库进行增删改查
Laravel 数据库实例教程 —— 使用查询构建器实现对数据库的高级查询
Eloquent ORM 实例教程 —— ORM概述、模型定义及基本查询
Eloquent ORM 实例教程 —— 模型创建、更新及批量赋值
Eloquent ORM 实例教程 —— 模型删除及软删除相关实现
Eloquent ORM 实例教程 —— 查询作用域和模型事件
Eloquent ORM 实例教程 —— 关联关系及其在模型中的定义(一)
Eloquent ORM 实例教程 —— 关联关系及其在模型中的定义(二)
在 Laravel 框架之外使用数据库查询构建器及 Eloquent ORM
将 Sequel Pro 中已存在的数据表导出为 Laravel 迁移文件
将 MySQL Workbench 中已存在的数据表导出到 Laravel 迁移文件
服务篇
29篇文章
Laravel Spark 牛刀初试 —— 安装、设置及使用
Laravel 实例教程 —— 如何在Laravel 5.1中进行自定义包开发
Laravel 5.1用户认证(一) —— 使用Laravel内置组件快速实现注册登录
Laravel 5.1用户认证(二) —— 使用Laravel内置组件快速实现密码重置
Laravel 5.1用户认证(三) —— 使用Socialite实现GitHub登录认证
Laravel 5.1 中的ACL用户授权及权限检查功能实现教程
Laravel 5.1 中创建自定义 Artisan 控制台命令实例教程
Laravel 支付解决方案之 Laravel Cashier (一)—— 安装配置篇
Laravel 支付解决方案之 Laravel Cashier (二)—— 付费会员&分期付款&生成发票
Laravel 支付解决方案之如何使用支付宝进行支付
Laravel 支付解决方案之如何使用银联支付进行支付
Laravel 支付解决方案之如何使用微信支付进行支付
Laravel 缓存实例教程(一) —— 基于Memcached缓存驱动的配置
Laravel 缓存实例教程(二) —— 基于模型+缓存对文章增删改查进行优化
Laravel中运行Gulp任务的利器 —— Laravel Elixir简介及入门教程
如何在 Laravel 5.1 中使用 Laravel Elixir 集成安装 Bootstrap
Laravel Elixir 深入探究(一):Elixir配置选项、前端资源文件编译及合并
Laravel Elixir 深入探究(二):版本控制、测试套件、任务执行以及自定义任务和扩展
Laravel 5.1中 Redis 的安装配置及基本使用教程
Laravel 5.1 分页功能实现及如何自定义分页样式
Laravel 5.1 中的异常处理器和HTTP异常处理实例教程
基于 Laravel 集成的 Monolog 库对日志进行配置和记录
Laravel 5.1 定义事件、事件监听器以及触发事件实例教程
使用 Laravel 5.1 的文件系统对文件进行存储、移动和删除操作
使用 Laravel 5.1 内置的本地化功能轻松实现多语言支持
在 Laravel 5.1 中使用SMTP驱动实现邮件发送(含附件和图片)详细教程
Laravel 队列系列 —— 基于 Redis 实现任务队列的基本配置和使用
Laravel 5.1 中 Session 数据存储、访问、删除及一次性Session实例教程
Laravel 5.1 测试系列 —— PHPUnit 安装及简单单元测试示例
实战篇
2篇文章
使用 Laravel 纯手工打造一个简单的电子商务网站(一) —— 后台新增商品及前台显示
使用 Laravel 纯手工打造一个简单的电子商务网站(二) —— 用户认证及购物车功能实现
图书
Laravel 5.1 基础教程
服务篇
Laravel 缓存实例教程(二) —— 基于模型+缓存对文章增删改查进行优化
Laravel 缓存实例教程(二) —— 基于模型+缓存对文章增删改查进行优化
由 学院君 创建于7年前, 最后更新于 2年前
版本号 #2
20670 views
14 likes
0 collects
上一节我们在config/cache.php中配置好了缓存驱动,其实我们配置使用什么缓存驱动在应用层面是体会不到的,因为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">


<textarea name="content" cols="50" rows="5"></textarea>


<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}">


<textarea name="content" cols="50" rows="5">{$post->content}</textarea>


<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);
});
我们将缓存有效期设置为一周。这样在文章创建或更新时会将数据保存到缓存,而删除文章时也会从缓存中移除数据,从而保证被删除后的文章查看详情时也不能浏览。
Laravel
缓存
模型
Memcached
增删改查
模型事件
点赞
取消点赞
收藏
取消收藏
赞赏
分享到以下平台:
<< 上一篇:
Laravel 缓存实例教程(一) —— 基于Memcached缓存驱动的配置
>> 下一篇:
Laravel中运行Gulp任务的利器 —— Laravel Elixir简介及入门教程
6 条评论
#1
传章
评论于 7年前
正在删除评论...
学院君,怎么将laravel的缓存压缩方式改为自定义的呢
laravel用的是serialize
我想改成用json或Msgpack
#2
学院君
评论于 7年前
正在删除评论...
你使用的是文件缓存吧 只有文件缓存使用了serialize
#3
传章
评论于 7年前
正在删除评论...
redis一样是用serialize来压缩
看了源码,redis压缩是写死的
怎么把原来的predis换成php扩展呢
#4
学院君
评论于 7年前
正在删除评论...
确实 没仔细看 这个要自定义缓存驱动吧
#5
易木
评论于 6年前
正在删除评论...
请问
3、在模型事件中使用缓存 的代码具体写在哪里?
#6
排骨
评论于 6年前
回复 #11
正在删除评论...
如果存在AppProvidersAppServiceProvider.php的话就写在boot方法里面,如果不存在 的话就再注册一个Provider在boot方法里写
登录后即可添加评论
升级为学院君订阅用户(新年优惠🎁)
内容导航
1、准备工作
2、修改控制器
3、在模型事件中使用缓存
相关推荐
HTTP控制器实例教程 —— 创建RESTFul风格控制器实现文章增删改查
Laravel 5.1 基础教程
基础篇
Eloquent ORM 实例教程 —— 查询作用域和模型事件
Laravel 5.1 基础教程
数据库篇
Laravel 缓存实例教程(一) —— 基于Memcached缓存驱动的配置
Laravel 5.1 基础教程
服务篇
在 Laravel 框架之外使用数据库查询构建器及 Eloquent ORM
Laravel 5.1 基础教程
数据库篇
进阶篇(六):Eloquent 模型事件和监听方式大全
Laravel 入门到精通教程
数据库与 Eloquent 模型
回到顶部
2022 基于 Laravel 6 构建
关于学院
订阅服务
友情链接
站点地图
本站 CDN 加速服务由又拍云赞助

Copyright ©uecom 京ICP备18064371号-1 IPV6
2024-03-29 04:54:00
uenu.com
10.0.12.16