缓存
配置信息
Laravel 给多种缓存系统提供丰富而统一的 API,缓存配置信息位于 config/cache.php
,在这个文件中你可以为你的应用程序指定默认的缓存驱动,Laravel 支持当前流行的缓存系统,如非常棒的 Memcached 和 Redis 。
缓存配置信息文件中也包括很多其他选项,你可以在文件中找到这些选项,请确保你看过这些选项说明。Laravel 默认使用将序列化缓存对象保存在文件系统中的 file
缓存驱动,对于大型应用程序而言,推荐你使用如 Memcached 或者 Redis 这样更强大的缓存驱动。你甚至 可以为一个驱动配置多个缓存配置信息。
驱动前提条件
数据库
当使用 database
缓存驱动时,你需要配置一个用来存放缓存项的数据库表,下面是一个 Schema
数据表结构声明的示例:
Schema::create('cache', function($table) {
$table->string('key')->unique();
$table->text('value');
$table->integer('expiration');
});
你也可以使用 php artisan cache:table
这个 Artisan 命令生成一个有合适数据表结构的 migration 。
Memcached
使用 Memcached 驱动需要安装 Memcached PECL 扩展包 。你可以把所有 Memcached 服务器都列在 config/cache.php
这个配置信息文件中:
'memcached' => [
[
'host' => '127.0.0.1',
'port' => 11211,
'weight' => 100
],
],
你也 可以把 host
选项配置到 UNIX 的 socket 路径中。如果你这样配置了,port
选项应该设置为 0
:
'memcached' => [
[
'host' => '/var/run/memcached/memcached.sock',
'port' => 0,
'weight' => 100
],
],
Redis
在使用 Redis 作为 Laravel 的缓存驱动前,你需要通过 Composer 安装 predis/predis
扩展包 (~1.0) 。
关于配置 Redis 的更多信息,请参考 Laravel 文档页面 。
缓存的使用
获取一个缓存实例
Illuminate\Contracts\Cache\Factory
和 Illuminate\Contracts\Cache\Repository
contracts 提供了访问 Laravel 缓存服务的机制。Factory
contract 则为你的应用程序定义了访问所有缓存驱动的机制。Repository
contract 是典型的用 cache
配置信息文件指定你的应用程序默认缓存驱动的实现。
然而,你也可以使用 Cache
facade,我们将在文档的后续中介绍。Cache
facade 提供了方便又简洁的方法访问缓存实例:
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\Cache;
class UserController extends Controller
{
/**
* Show a list of all users of the application.
*
* @return Response
*/
public function index()
{
$value = Cache::get('key');
//
}
}
访问多个缓存仓库
使用Cache
facade,可通过 store
方法来访问缓存仓库,传入 store
方法的键应该对应一个缓存配置信息文件中的 stores
配置信息数组中列出的配置值:
$value = Cache::store('file')->get('foo');
Cache::store('redis')->put('bar', 'baz', 10);
从缓存中获取项目
Cache
facade 中的 get
方法用来从缓存中获取缓存项,如果缓存中不存在该缓存项,返回 null
。你也可以向 get
方法传递第二个参数,用来指定缓存项不存在时返回的默认值:
$value = Cache::get('key');
$value = Cache::get('key', 'default');
你甚至可以将 闭包
作为默认值传递。如果指定的缓存项在缓存中不存在,闭包
的结果将被返回。传递一个闭包允许你延迟从数据库或外部服务中取出默认值:
$value = Cache::get('key', function() {
return DB::table(...)->get();
});
确认项目是否存在
has
方法可以用来检查一个项目是否存在于缓存中:
if (Cache::has('key')) {
//
}
递增与递减值
递增
和 递减
方法可以用来调整缓存中整数项目值。这两个方法都可以传入一个可选的第二个参数,用来指示要递增或递减多少值:
Cache::increment('key');
Cache::increment('key', $amount);
Cache::decrement('key');
Cache::decrement('key', $amount);
获取和更新
有时 你可能会想从缓存中取出一个项目,但也想在取出的项目不存在时存入一个默认值,例如,你可能会想从缓存中取出所有用户,或者当用户不存在时,从数据库中将这些用户取出并放入缓存中,你可以使用 Cache::remember 方法实现:
$value = Cache::remember('users', $minutes, function() {
return DB::table('users')->get();
});
如果缓存项在缓存中不存在,则返回给 remember
方法的闭包将会被运行,而且闭包的运行结果将会被存放在缓存中。
获取和删除
如果你需要从缓存中获取一个缓存项然后删除它,你可以使用 pull
方法。像 get
方法一样,如果缓存项在缓存中不存在,null
将被返回:
$value = Cache::pull('key');
存储项目到缓存中
你可以使用 Cache
facade 的 put
方法来存放缓存项到缓存中,当你在缓存中存放缓存项时,你需要使用第三个参数来设定缓存的存放时间:
Cache::put('key', 'value', $minutes);
如果要指定一个缓存项过期的分钟数,你也可以传递一个 DateTime
实例来表示该缓存项过期的时间点:
$expiresAt = Carbon::now()->addMinutes(10);
Cache::put('key', 'value', $expiresAt);