缓存
配置信息
Laravel 给各种不同的缓存系统提供了统一的 API,缓存的配置文件都放在 config/cache.php
中,在这个文件中,你可以指定默认想 用哪个缓存驱动,Laravel 支持当前流行的缓存后端,如 Memcached 和 Redis。
缓存配置文件还包含了其它的选项,你可以在文件中找到这些选项,请确保你都有读过这些选项上方的说明。Laravel 默认采用的缓存驱动是 file
,这个驱动在文件系统中保存了序列化的缓存对象,对于大型应用程序而言,Laravel 比较建议你使用内存缓存,例如 Memcached 或 APC。
译者注:推荐使用 Redis 来做缓存驱动。缓存和 Session 一起使用 Redis 的话,还需要多余的配置,请参考 - Laravel 下配置 Redis 让缓存、Session 各自使用不同的 Redis 数据库
场景布置
数据库
当使用 database
这个缓存驱动时,你需要配置一个数据库表来放置缓存项目,下面是表结构:
Schema::create('cache', function($table) {
$table->string('key')->unique();
$table->text('value');
$table->integer('expiration');
});
Memcached
使用 Memcached 做缓存需要先安装 Memcached PECL 扩展包。
默认的 配置文件 采用以 Memcached::addServer 为基础的 TCP/IP:
'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
facade,我们将会在此文档中介绍,Cache
facade 提供了方便又简洁的方法访问缓存实例。
例如,我们试着在一个控制器中引用 Cache
facade:
<?php
namespace App\Http\Controllers;
use Cache;
use Illuminate\Routing\Controller;
class UserController extends Controller
{
/**
* 显示应用程序中所有用户列表。
*
* @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')) {
//
}
递增与递减值
increment
和 decrement
方法 可以用来调整缓存中的整数项目值,这两个方法都可以选择性的传入第二个参数,用来指示要递增或递减多少:
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();
});