缓存是web开发中重要的一部分,我相信很多人和我一样,经常忽略这个问题。 随着工作经验的累积,我已经意识到缓存是多么的重要,这里我通过 Scotch 来解释一下它的重要性。

通过观察发现,Scotch每天按照计划发布文章,然而,上一次发布文章的24小时内,新的文章不会被放出,因此,登陆页面上的数据将保持24小时不变。 换句话说,在24小时内( 更准确的说是22-23个小时)向数据库请求文章数据是没有意义的。

缓存可以很好的解决这个问题,当遇到一个页面请求时,我们可以把结果缓存22个小时,只要在这个时间内通过控制器请求的数据,都是缓存中的数据,直到缓存超时。

下面我们来看看Laravel 中缓存的基本用法,然后看一个简单的例子,试试缓存到底能带来多大的加速。

在 Laravel 中缓存的基本用法

Laravel 使得我们可以轻松地转换出我们想要生成缓存的方式。我们很容易修改缓存驱动方式。只需到 config / cache.php 来查看可用的驱动程序:

  • apc
  • array
  • database
  • file
  • memcached
  • redis

你可以在 .env 文件中修改缓存驱动:

CACHE_DRIVER=file

你可以继续尝试修改它们而不用担心配置,因为它默认驱动是 file 。

Cache facade 暴露了很多静态方法来创建,更新,获取,删除和检查缓存内容的存在。让我们在构建演示应用程序之前先了解一下这些方法。

建立/更新缓存值

我们使用 put() 方法来新增或更新缓存值。该方法必须使用 3 个参数:

  • 键名
  • 键值
  • 过期时间 单位分钟

例如:

Cache::put('key', 'value', 10);

键名 是缓存的唯一标识,需要时要用它来获取值。

此外,我们也可以用 remember() 方法自动获取和更新一个缓存值。该方法首先检查 键名 是否存在,如果已经创建则返回结果。否则它会创建新的 键名 ,并用闭包返回结果进行赋值,就象下面:

Cache::remember('articles', 15, function() {
return Article::all();
});

参数 15 是要缓存的分钟数。这样的话,我们甚至根本不必检查缓存是否过期。Laravel 不仅会替我们打理,而且会获取或重新生成该缓存,不需要我们显式地告诉它如何操作。

检索缓存值

缓存的值可以通过 get() 方法去获取,这个方法接受一个参数 key :

Cache::get('key');

检查是否已存在key

有时候在更新或者取回缓存值之前判断这个缓存的key是否存在是很有必要的,使用 has() 方法就可以实现:

if (Cache::has('key')){
Cache::get('key');
} else {
Cache::put('key', $values, 10);
}

删除缓存值

删除缓存值可以用 forget() 方法并把需要删除的 key 作为参数传进去:

Cache::forget('key');

我们也可以检索缓存值并删除它。我喜欢把这个称为一次性缓存:

$articles = Cache::pull('key');

我们还可以使用以下命令在缓存过期前就把所有缓存清楚掉:

php artisan cache:clear

一个例子

这是一个简单的演示,主要是为了说明是否使用缓存对请求响应所需要时间的影响,为了让你能更直接的了解,我建议你跟着教程自己来 构建 一个 Laravel 例子。

模型和表迁移

使用下面命令新建一个 Article 模型:

php artisan make:model Article -m

-m 参数会自动创建一个 migration ,所以无需再使用 create migration 命令了,这个命令会创建 App/Article.php 和  database/migrations/xxxx_xx_xx_xxxxxx_create_articles_table.php 文件。

修改你的 migration 文件并添加以下两行:

public function up() {
Schema::create('articles', function (Blueprint $table) {
$table->increments('id'); // add the following
$table->string("title");
$table->string("content"); $table->timestamps();
});
}

然后我们就可以用以下命令迁移我们的数据库了:

php artisan migrate

填充数据库

接下来我们需要填充文章的数据库表,在 database/seeds/DatabaseSeeder.php 中,修改  run() 如下所示:

public function run() {
Model::unguard(); // use the faker library to mock some data
$faker = Faker::create(); // create 30 articles
foreach(range(1, 30) as $index) {
Article::create([
'title' => $faker->sentence(5),
'content' => $faker->paragraph(6)
]);
} Model::reguard();
}

Laravel中包含 Faker 库用以快速生成假数据,我们可以使用PHP的 range() 方法去生成30条假数据。

接下来我们就可以通过这条 artisan 命令去填充数据库了:

php artisan db:seed

创建文章控制器

接下来,我们可以创建一个处理请求和缓存的控制器,首先它是空的:

php artisan make:controller ArticlesController

...然后我们增加一个路由 app/Http/routes.php 指向这个文章控制器的 index 方法:

Route::group(['prefix' => 'api'], function() {

    Route::get('articles', 'ArticlesController@index');

});

现在我们的数据库都是用样本数据建立起来的,我们可以进行测试了。

未使用缓存的响应

让我们看看我们传统的控制器方法是什么样的,没有缓存,处理响应需要多长时间,在 index() 方法中,返回文章的资源数据:

public function index() {
$articles = Articles::all();
return response()->json($articles);
}

你也可以使用 Postman 去请求(http://localhost/api/articles) 或者直接用浏览器打开,你就可以看到如下所示。

请注意在本地开发服务器上完成此请求所花费的时间。

从缓存中返回的响应

现在让我们尝试使用缓存,看看数据响应所花费的时间是否会有显着差异。修改 index()方法为:

 public function index() {
$articles = Cache::remember('articles', 22*60, function() {
return Article::all();
});
return response()->json($articles);
}

现在我们使用 remember() 方法缓存了文章,缓存时间为 22 小时,再次运行并观察所花费的时间,可以看我的截图:

结果和建议

在我的标准开发环境中测试得出,使用缓存时产生响应所需的时间比没有使用的时候要少:

未使用缓存

Server Hits Time
1st 4478ms
2nd 4232ms
3rd 2832ms
4th 3428ms
Avg 3742ms

使用缓存 (File 驱动)

Server Hits Time
1st 4255ms
2nd 3182ms
3rd 2802ms
4th 3626ms
Avg 3466ms

使用缓存 (Memcached 驱动)

Server Hits Time
1st 3626ms
2nd 566ms
3rd 1462ms
4th 1978ms
Avg 1908ms 

Laravel 中缓存驱动的速度比较的更多相关文章

  1. laravel 中使用tinker 验证驱动加载是否成功

    在验证laravel 中   InvalidArgumentException Driver [WeiBo] not supported. public function weibo() { retu ...

  2. Laravel中的日志与上传

    PHP中的框架众多,我自己就接触了好几个.大学那会啥也不懂啥也不会,拿了一个ThinkPHP学了.也许有好多人吐槽TP,但是个人感觉不能说哪个框架好,哪个框架不好,再不好的框架你能把源码读上一遍,框架 ...

  3. [原创]Laravel 的缓存源码解析

    目录 前言 使用 源码 Cache Facade CacheManager Repository Store 前言 Laravel 支持多种缓存系统, 并提供了统一的api接口. (Laravel 5 ...

  4. Laravel 中使用 Redis 数据库

    一.前言 Redis 是一个开源高效的键值对存储系统,它通常用作为一个数据结构服务器来存储键值对,它可以支持字符串.散列.列表.集合.有序集合. 1. 安装 predis/predis 在 Larav ...

  5. laravel 中CSS 预编译语言 Sass 快速入门教程

    CSS 预编译语言概述 CSS 作为一门样式语言,语法简单,易于上手,但是由于不具备常规编程语言提供的变量.函数.继承等机制,因此很容易写出大量没有逻辑.难以复用和扩展的代码,在日常开发使用中,如果没 ...

  6. 深入理解 Laravel 中 config 配置加载原理

    Laravel的配置加载其实就是加载config目录下所有文件配置.如何过使用php artisan config:cache则会把加载的配置合并到一个配置文件中,下次请求就不会再去加载config目 ...

  7. PHP中缓存技术

    1.全页面静态化缓存 也就是将页面全部生成html静态页面,用户访问时直接访问的静态页面,而不会去走php服务器解析的流程.此种方式,在CMS系统中比较常见,比如dedecms: 一种比较常用的实现方 ...

  8. laravel中session的过期时间

    在项目开发的过程中,前后端分离 需要用session保存用户的登陆信息 这就涉及到session的有效期了 session又分为php中的session有效期和laravel中的session的有效期 ...

  9. laravel Redis缓存

    首先在app/config/cache.php配置文件下改变一下缓存的驱动方式改为redis composer require predis/predis 先安装conposer的扩展安装包 然后在c ...

随机推荐

  1. AM335x(TQ335x)学习笔记——LCD驱动移植

    TI的LCD控制器驱动是非常完善的,共通的地方已经由驱动封装好了,与按键一样,我们可以通过DTS配置完成LCD的显示.下面,我们来讨论下使用DTS方式配置内核完成LCD驱动的思路. (1)初步分析 由 ...

  2. dojo中表格行隐藏出错

    1.错误描述 TypeError:role._by_idx[e.rowIndex].hide is not a function           (54 out of range 3) 2.错误原 ...

  3. C# 获取一个独一无二的字符串 GUID

    在保存文件,创建目录时,为了保证名称不重复,经常使用Random产生一个随机数,有更简单且不会重复的办法是: Guid.NewGuid().ToString() 就会生成一个类似 37c1acec-4 ...

  4. freemarker字符串拼接(十二)

    freemarker字符串拼接 1.字符串拼接的几种类型 (1)字符串和字符串 (2)字符串和数字 (3)字符串和字符串变量 (4)字符串变量和字符串变量 2.演示示例 <#--定义字符串--& ...

  5. Link带参数的Verilog模块(Design Compiler)

    在Design Compiler中,Verilog文件可以用read_verilog命令读入,用link命令连接.以下是连接两个文件RegisterFile.v和Test.v的脚本: # Read d ...

  6. 【HDU2255】奔小康赚大钱

    题面 传说在遥远的地方有一个非常富裕的村落,有一天,村长决定进行制度改革:重新分配房子. 这可是一件大事,关系到人民的住房问题啊.村里共有n间房间,刚好有n家老百姓,考虑到每家都要有房住(如果有老百姓 ...

  7. 【BZOJ2243】【SDOI2011】染色(树链剖分,线段树)

    题面 我们也要换个花样,这回提供洛谷的题面 题解 线段树+树链剖分大水题 维护颜色段的方法很简单呀... 维护当前区间内的颜色段个数, 以及当前区间左端和右端的颜色, 合并的时候考虑是否要减一下就行了 ...

  8. 【国家集训队2010】小Z的袜子(莫队)

    题面 Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程,于是他决定听天由命-- 具体来说,小Z把 ...

  9. 微信小程序之换肤的功能

    pc或者移动端实现换肤功能还是比较简单的,大致就是需要换肤的css,还有正常的css:把当前皮肤类型存入本地:然后通过js读取并判断当前应该加载哪套css. 由于微信小程序没有操作wxss的api,所 ...

  10. django 下拉菜单显示为object的解决办法

    在创建完Django数据库结构之后,使用Django自带的强大的admin功能往数据库中添加数据,图形化界面如下: 但时候有下拉框选项(只要在model中有定义Charfield就会显示为下拉框),如 ...