缓存 配置 laravel 对多种缓存系统提供了统一的 api。缓存的配置文件存放在 config/cache.php。你可以在这个文件中指定整个应用默认使用何种缓存驱动。laravel 支持当前主流的缓存系统如 memcached 和 redis。
缓存的配置文件也包含了一些额外的配置选项,这些选项在文件中都有文档注释,你应该确保自己已经读了这些选项注释。默认的,laravel 配置使用 file 缓存驱动,该驱动会在文件系统中存储序列化的缓存对象。对于大型应用,建议使用内存级的缓存,如 memcached 或者 apc。你甚至可以在 laravel 中配置多种缓存配置到相同的驱动。
缓存先决条件 数据库
当使用 database 缓存驱动时,你需要建立一个表来包含这些缓存项。你可以根据下面的 schema 定义来建立表文件:
schema::create('cache', function ($table) { $table->string('key')->unique(); $table->text('value'); $table->integer('expiration'); });
你也可以通过使用 php artisan cache:table artisan 命令来生成正确的缓存表结构迁移。
memcached
使用 memcached 缓存需要安装 memcached pecl package。
默认的配置基于 memcached::addserver 使用 tcp/ip:
'memcached' => [ [ 'host' => '127.0.0.1', 'port' => 11211, 'weight' => 100 ]],
你也可以使用 unix socket 路径来设置 host。如果你这么做,你需要设置 port 为 0:
'memcached' => [ [ 'host' => '/var/run/memcached/memcached.sock', 'port' => 0, 'weight' => 100 ],],
redis
在你使用 redis 缓存之前,你需要先通过 composer 安装 predis/predis。关于更多的 redis 配置信息,你可以参考 laravel documentation page。
缓存使用 获取缓存实例 illuminate\contracts\cache\factory 和 illuminate\contracts\cache\repository 契约提供对 laravel 缓存服务的访问。factory 契约提供了应用中所有缓存驱动的定义。repository 契约通常是一个基于你的 cache 配置文件所使用的默认缓存驱动的实现。
事实上,你也可以使用 cache 假面,在这篇文档中,我们都是使用 cache 假面进行举例。cache 假面提供了一种方便简洁的方式来访问 laravel 底层缓存契约的实现。
例如,让我们引入 cache 假面到控制器:
get('foo');cache::store('redis')->put('bar', 'baz', 10);
获取缓存项 你可以通过使用 cache 假面的 get 方法来从缓存中获取相关项的值。如果该项在缓存中并不存在,则返回 null 。如果你需要,你也可以传递第二个参数到 get 方法,这个参数所传递的值会在缓存中项不存在时被返回:
$value = cache::get('key');$value = cache::get('key', 'default');
你甚至可以传递 closure 作为默认值。如果缓存的项不存在,closure 所返回的值将被做为默认值。传递闭包的方式可以使你从数据库或者其他外部服务中延迟获取默认值:
$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(); });
如果缓存中没有检索到该项,传递到 remeber 方法中的闭包将会被执行并且其执行结果将会在缓存中进行替换。
你也可以合并 remember 和 forever 方法:
$value = cache::rememberforever('users', function () { return db::table('users')->get(); });
检索并删除
如果你需要检索一个项目,并在检索到的同时从缓存中删除该项,你可以使用 pull 方法。就像 get 方法一样,如果未检索到该项,将会返回 null :
$value = cache::pull('key');
存储项目到缓存 你可以使用 cache 假面的 put 方法来存储项目到缓存中。当你存储一个项到缓存中时,你需要指定一个该项需要被缓存的分钟值:
cache::put('key', 'value', $minutes);
除了传递一个数值作为缓存过期的分钟值,你也可以通过传递一个 php datetime 实例来设置缓存的失效时间:
$expiresat = carbon::now()->addminutes(10);cache::put('key', 'value', $expiresat);
add 方法只会在相应的项在缓存中不存在时才会被添加进缓存。该方法会在项目被添加到缓存后返回 true。否则返回 false:
cache::add('key', 'value', $minutes);
forever 方法可以用来将项目永久的添加进缓存。该值只有手动的使用 forget 方法才能被移除:
cache::forever('key', 'value');
从缓存中移除项目 你可以使用 cache 假面的 forget 方法来从缓存中移除某项:
cache::forget('key');
你可以使用 flush 方法来擦除所有的缓存:
cache::flush();
擦除缓存并不会根据前缀来进行智能擦除,它会移除所有的缓存。所以如果你的应用和其他的应用共享缓存,你应该谨慎的使用该方法。
缓存标签 注意: 缓存标签并不支持 file 或者 database 缓存驱动。另外,对于将多种标签标记为永久存储的驱动,性能最好的是能够提供自动清除过期记录的驱动,比如 memcached。
存储标记了的项目到缓存 缓存标签允许你将相关的项目进行关联标记。并且允许一次性清除所有给定标签的缓存项。你可以通过有序的标签数组来访问被标记的缓存项目。比如,让我们访问被标记的项目并使用 put 方法来设置缓存值:
cache::tags(['people', 'artists'])->put('john', $john, $minutes);cache::tags(['people', 'authors'])->put('anne', $anne, $minutes);
事实上,你并没有被限制只使用 put 方法。你可以在标签中使用任意的缓存存储方法。
访问被标记的缓存项 为了访问被标记了的缓存项,你需要传递相应的有序列表到 tags 方法:
$john = cache::tags(['people', 'artists'])->get('john');$anne = cache::tags(['people', 'authors'])->get('anne');
你可以一次性的擦除分配的标记或者标记列表中的所有项。比如,你可以使用 flush 方法来删除所有的 people 和 authors 标签和两者组成的有序列标签里的所有缓存项。所以,anne 和 john 都会被从缓存中移除:
cache::tags(['people', 'authors'])->flush();
下面的语句将会作为上面语句的对照,将只会从缓存中删除 authors 标签的项目,所以 anne 会被删除,而 john 被保留:
cache::tags('authors')->flush();
添加自定义的缓存驱动 为了在自定义的缓存驱动中继承 laravel 的缓存。我们需要使用 cache 假面的 extend 方法,该方法被用来绑定自定义缓存到底层管理中。通常这些都是在服务提供者中完成。
比如,注册一个新的缓存驱动并命名为 'mongo':
[ 'app\listeners\logcachemissed', ], 'illuminate\cache\events\keyforgotten' => [ 'app\listeners\logkeyforgotten', ], 'illuminate\cache\events\keywritten' => [ 'app\listeners\logkeywritten', ], ];